| 80 | end |
| 81 | |
| 82 | def self.update_changelog(version, language, path, changelog, header) |
| 83 | tag = previous_tag(version, language) |
| 84 | bullet = language == 'javascript' ? '-' : '*' |
| 85 | skip_patterns = /^(bump|update.*version|Bumping to nightly)/i |
| 86 | tags_to_remove = /\[(dotnet|rb|py|java|js|rust)\]:?\s?/ |
| 87 | |
| 88 | command = "git log #{tag}...HEAD --pretty=format:'%s' --reverse -- #{path}" |
| 89 | log = `#{command}` |
| 90 | raise "Failed to generate changelog: #{command}" unless $CHILD_STATUS.success? |
| 91 | |
| 92 | entries = log.lines |
| 93 | .map(&:strip) |
| 94 | .grep(/\(#\d+\)/) |
| 95 | .grep_v(skip_patterns) |
| 96 | .map { |line| line.gsub(tags_to_remove, '') } |
| 97 | .map { |line| "#{bullet} #{line}" } |
| 98 | .join("\n") |
| 99 | |
| 100 | if version[-1] == '0' && language != 'rust' |
| 101 | versions = cdp_versions.join(', ') |
| 102 | cdp_line = "#{bullet} Support CDP versions: #{versions}" |
| 103 | entries = entries.empty? ? cdp_line : "#{cdp_line}\n#{entries}" |
| 104 | end |
| 105 | |
| 106 | content = File.read(changelog) |
| 107 | File.write(changelog, "#{header}\n#{entries}\n\n#{content}") |
| 108 | end |
| 109 | |
| 110 | def self.aggregate_errors(**steps) |
| 111 | failures = steps.filter_map do |name, closure| |