list-brahches.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. /* eslint-disable no-console */
  2. /*
  3. * USAGE:
  4. * node list-branches [OPTION]
  5. *
  6. * OPTIONS:
  7. * --disused : Return disused branches (default)
  8. * --illegal : Return illegal named branches
  9. */
  10. const { execSync } = require('child_process');
  11. const url = require('url');
  12. const EXCLUDE_TERM_DAYS = 14;
  13. const EXCLUDE_PATTERNS = [
  14. /^feat\/custom-sidebar-2$/,
  15. // https://regex101.com/r/Lnx7Pz/3
  16. /^dev\/[\d.x]*$/,
  17. ];
  18. const LEGAL_PATTERNS = [
  19. /^master$/,
  20. // https://regex101.com/r/p9xswM/4
  21. /^(dev|feat|imprv|support|fix|rc|release|tmp)\/.+$/,
  22. ];
  23. const GITHUB_REPOS_URI = 'https://github.com/weseek/growi/';
  24. class BranchSummary {
  25. constructor(line) {
  26. const splitted = line.split('\t'); // split with '%09'
  27. this.authorDate = new Date(splitted[0].trim());
  28. this.authorName = splitted[1].trim();
  29. this.branchName = splitted[2].trim().replace(/^origin\//, '');
  30. this.subject = splitted[3].trim();
  31. this.githubLink = url.resolve(GITHUB_REPOS_URI, `commits/${this.branchName}`);
  32. }
  33. }
  34. function getExcludeTermDate() {
  35. const date = new Date();
  36. date.setDate(date.getDate() - EXCLUDE_TERM_DAYS);
  37. return date;
  38. }
  39. function getBranchSummaries() {
  40. // exec git for-each-ref
  41. const out = execSync(`\
  42. git for-each-ref refs/remotes \
  43. --sort=-committerdate \
  44. --format='%(authordate:iso) %09 %(authorname) %09 %(refname:short) %09 %(subject)'
  45. `).toString();
  46. // parse
  47. const summaries = out
  48. .split('\n')
  49. .filter(v => v !== '') // trim empty string
  50. .map(line => new BranchSummary(line))
  51. .filter((summary) => { // exclude branches that matches to patterns
  52. return !EXCLUDE_PATTERNS.some(pattern => pattern.test(summary.branchName));
  53. });
  54. return summaries;
  55. }
  56. async function main(mode) {
  57. const summaries = getBranchSummaries();
  58. let filteredSummaries;
  59. switch (mode) {
  60. case 'illegal':
  61. filteredSummaries = summaries
  62. .filter((summary) => { // exclude branches that matches to patterns
  63. return !LEGAL_PATTERNS.some(pattern => pattern.test(summary.branchName));
  64. });
  65. break;
  66. default: {
  67. const excludeTermDate = getExcludeTermDate();
  68. filteredSummaries = summaries
  69. .filter((summary) => {
  70. return summary.authorDate < excludeTermDate;
  71. });
  72. break;
  73. }
  74. }
  75. console.log(filteredSummaries);
  76. }
  77. const args = process.argv.slice(2);
  78. let mode = 'disused';
  79. if (args.length > 0 && args[0] === '--illegal') {
  80. mode = 'illegal';
  81. }
  82. main(mode);