list-brahches.js 2.2 KB

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