11const  {  Buffer }  =  require ( 'buffer' ) ; 
22const  yaml  =  require ( 'js-yaml' ) ; 
33const  bluebird  =  require ( 'bluebird' ) ; 
4+ const  {  sub }  =  require ( "date-fns" ) ; 
45
56const  getConfigFile  =  async  ( context ,  owner )  =>  { 
67  const  repoPaths  =  { 
@@ -74,6 +75,49 @@ const getLatestCommitInPullRequest = async (context, owner, repo, pullNumber) =>
7475  return  pull . data . head . sha ; 
7576} ; 
7677
78+ const  getStalePulls  =  async  ( context ,  owner )  =>  { 
79+   const  { 
80+     deploy, 
81+     stale_pull_cleanup : cleanupPolicy , 
82+   }  =  getConfig ( owner ) ; 
83+   if  ( ! cleanupPolicy . enabled )  { 
84+     return ; 
85+   } 
86+   const  duration  =  ( cleanupPolicy . duration  ||  '7 days' ) . split ( ' ' ) ; 
87+   const  filterDate  =  sub ( new  Date ( ) ,  {  [ duration [ 1 ] ] : parseInt ( duration [ 0 ] ,  10 )  } ) ; 
88+   const  repos  =  deploy . map ( ( d )  =>  d . name ) ; 
89+   return  repos . reduce ( async  ( acc ,  repo )  =>  { 
90+     const  foundPulls  =  await  context . octokit . pulls . list ( { 
91+       owner, 
92+       repo, 
93+       state : 'open' , 
94+       sort : 'updated' , 
95+       direction : 'asc' , 
96+     } ) ; 
97+     acc . push ( 
98+       ...foundPulls 
99+         . filter ( ( p )  =>  new  Date ( p . updated_at )  <  filterDate ) 
100+         . map ( ( p )  =>  ( {  pullNumber : p . number ,  owner,  repo } ) ) 
101+     ) ; 
102+   } ,  [ ] ) ; 
103+ } 
104+ 
105+ const  stalePromise  =  { } ; 
106+ const  syncStale  =  async  ( app ,  context ,  owner )  =>  { 
107+   if  ( ! stalePromise [ owner ] )  { 
108+     stalePromise [ owner ]  =  new  Promise ( ( resolve ,  reject )  =>  { 
109+       setInterval ( async  ( )  =>  { 
110+         const  pulls  =  await  getStalePulls ( context ,  owner ) ; 
111+         await  pulls . reduce ( async  ( _ ,  {  owner,  repo,  pullNumber } )  =>  { 
112+           app . log . info ( `Cleaning up resources for stale pull: ${ owner } ${ repo } ${ pullNumber }  ) ; 
113+           // const payloads = await getDeletePayloads(context, { owner, repo, pullNumber }); 
114+           // await deleteDeployments(app, context, owner, payloads); 
115+         } ,  Promise . resolve ( ) ) ; 
116+       } ,  20  *  60  *  1000 ) ; 
117+     } ) ; 
118+   } 
119+ } 
120+ 
77121const  configMap  =  { } ; 
78122const  configMapPromise  =  { } ; 
79123const  getConfig  =  ( owner )  =>  configMap [ owner ] ; 
@@ -92,6 +136,11 @@ const syncConfig = async (context, owner) => {
92136  } 
93137} 
94138
139+ const  sync  =  async  ( app ,  context ,  owner )  =>  { 
140+   await  syncConfig ( context ,  owner ) ; 
141+   await  syncStale ( app ,  context ,  owner ) ; 
142+ } ; 
143+ 
95144const  getDeployPayloads  =  async  ( context ,  {  owner,  repo,  pullNumber,  sha =  ''  } ,  components  =  [ ] ,  action  =  '' ,  logger  =  null )  =>  { 
96145  const  config  =  getConfig ( owner ) ; 
97146  const  componentsMap  =  new  Map ( components . map ( ( c )  =>  [ c . component ,  c ] ) ) ; 
@@ -154,7 +203,7 @@ const getDeployPayloads = async (context, { owner, repo, pullNumber, sha = '' },
154203      environment, 
155204      values : values  ||  component , 
156205      domain : `${ environment } ${ domain }  , 
157-       action : 'deploy' 
206+       action : 'deploy' , 
158207    } ] ; 
159208  } ,  Promise . resolve ( [ ] ) ) ; 
160209
@@ -262,8 +311,7 @@ const deleteDeployments = async (app, context, owner, payloads) => {
262311 * @param  {import('probot').Probot } app 
263312 */ 
264313module . exports  =  ( app )  =>  { 
265-   // Your code here 
266-   app . log . info ( "Yay, the app was loaded!" ) ; 
314+   app . log . info ( "Bot started!" ) ; 
267315  app . on ( 
268316    "issue_comment.created" , 
269317    async  ( context )  =>  { 
@@ -286,7 +334,7 @@ module.exports = (app) => {
286334      const  pullNumber  =  context . payload . issue . html_url . indexOf ( '/pull/' ) 
287335        ? context . payload . issue . number  : null ; 
288336
289-       await  syncConfig ( context ,  owner ) ; 
337+       await  sync ( context ,  owner ) ; 
290338
291339      if  ( ! pullNumber )  { 
292340        app . log . info ( 'Cannot find pull request. Deploy dismissed.' ) ; 
@@ -322,7 +370,7 @@ module.exports = (app) => {
322370      }  =  context . payload ; 
323371      app . log . info ( 'push' ) ; 
324372      app . log . info ( {  owner,  repo,  sha,  ctx } ) ; 
325-       await  syncConfig ( context ,  owner ) ; 
373+       await  sync ( context ,  owner ) ; 
326374
327375      const  config  =  getConfig ( owner ) ; 
328376      const  {  commit : commitEvent  }  =  config . events  ||  {  commit : 'deploy'  } ; 
@@ -356,7 +404,7 @@ module.exports = (app) => {
356404      } 
357405      app . log . info ( `pull_request.${ action }  ) ; 
358406      app . log . info ( {  owner,  repo,  ctx,  pullNumber } ) ; 
359-       await  syncConfig ( context ,  owner ) ; 
407+       await  sync ( context ,  owner ) ; 
360408
361409      const  config  =  getConfig ( owner ) ; 
362410      const  {  pull_request : prEvent  }  =  config . events  ||  {  pull_request : 'deploy'  } ; 
0 commit comments