cherrypick.ts 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import { Task, TaskRunner } from './task';
  2. import axios from 'axios';
  3. interface CherryPickOptions {}
  4. const cherryPickRunner: TaskRunner<CherryPickOptions> = async () => {
  5. let client = axios.create({
  6. baseURL: 'https://api.github.com/repos/grafana/grafana',
  7. timeout: 10000,
  8. // auth: {
  9. // username: '<username>',
  10. // password: '<personal access token>',
  11. // },
  12. });
  13. const res = await client.get('/issues', {
  14. params: {
  15. state: 'closed',
  16. labels: 'cherry-pick needed',
  17. },
  18. });
  19. // sort by closed date ASC
  20. res.data.sort(function(a, b) {
  21. return new Date(a.closed_at).getTime() - new Date(b.closed_at).getTime();
  22. });
  23. let commands = '';
  24. console.log('--------------------------------------------------------------------');
  25. console.log('Printing PRs with cherry-pick-needed, in ASC merge date order');
  26. console.log('--------------------------------------------------------------------');
  27. for (const item of res.data) {
  28. if (!item.milestone) {
  29. console.log(item.number + ' missing milestone!');
  30. continue;
  31. }
  32. const issueDetails = await client.get(item.pull_request.url);
  33. console.log(`* ${item.title}, (#${item.number}), merge-sha: ${issueDetails.data.merge_commit_sha}`);
  34. commands += `git cherry-pick -x ${issueDetails.data.merge_commit_sha}\n`;
  35. }
  36. console.log('--------------------------------------------------------------------');
  37. console.log('Commands (in order of how they should be executed)');
  38. console.log('--------------------------------------------------------------------');
  39. console.log(commands);
  40. };
  41. export const cherryPickTask = new Task<CherryPickOptions>();
  42. cherryPickTask.setName('Cherry pick task');
  43. cherryPickTask.setRunner(cherryPickRunner);