Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
seleniumhq
GitHub Repository: seleniumhq/selenium
Path: blob/trunk/rake_tasks/common.rb
8296 views
1
# frozen_string_literal: true
2
3
require 'git'
4
require 'net/http'
5
require 'fileutils'
6
7
BINDING_TARGETS = {
8
'java' => '//java/...',
9
'py' => '//py/...',
10
'rb' => '//rb/...',
11
'dotnet' => '//dotnet/...',
12
'javascript' => '//javascript/selenium-webdriver/...'
13
}.freeze
14
15
# Shared utilities used by language-specific rake tasks
16
module SeleniumRake
17
BINDINGS = %w[ruby python javascript java dotnet].freeze
18
19
class << self
20
attr_accessor :git
21
end
22
23
# Parse a release tag like "selenium-4.28.0" or "selenium-4.28.1-ruby"
24
# Returns { version:, language:, patch: } where language defaults to 'all'
25
def self.parse_tag(tag)
26
pattern = /^selenium-(\d+\.\d+\.\d+)(?:-(#{BINDINGS.join('|')}))?$/
27
match = tag&.match(pattern)
28
raise "Invalid tag format: #{tag}" unless match
29
30
version = match[1]
31
language = match[2] || 'all'
32
patch = version.split('.')[2].to_i
33
34
if patch.positive? && language == 'all'
35
raise "Patch releases must specify a language (e.g., selenium-#{version}-ruby)"
36
end
37
raise 'Full releases (X.Y.0) cannot have a language suffix' if patch.zero? && language != 'all'
38
39
{version: version, language: language, patch: patch}
40
end
41
42
def self.updated_version(current, desired = nil, nightly = nil)
43
if !desired.nil? && desired != 'nightly'
44
# If desired is present, return full 3 digit version
45
desired.split('.').tap { |v| v << 0 while v.size < 3 }.join('.')
46
elsif current.split(/\.|-/).size > 3
47
# if current version is already nightly, just need to bump it; this will be noop for some languages
48
pattern = /-?\.?(nightly|SNAPSHOT|dev|\d{12})\d*$/
49
current.gsub(pattern, nightly)
50
elsif current.split(/\.|-/).size == 3
51
# if current version is not nightly, need to bump the version and make nightly
52
"#{current.split(/\.|-/).tap { |i| (i[1] = i[1].to_i + 1) && (i[2] = 0) }.join('.')}#{nightly}"
53
end
54
end
55
56
def self.previous_tag(current_version, language = nil)
57
version = current_version.split(/\.|-/)
58
if version.size > 3
59
puts 'WARNING - Changelogs not updated when set to prerelease'
60
elsif version[2].to_i > 1
61
# specified as patch release
62
patch_version = (version[2].to_i - 1).to_s
63
"selenium-#{[[version[0]], version[1], patch_version].join('.')}-#{language}"
64
elsif version[2] == '1'
65
# specified as patch release; special case
66
"selenium-#{[[version[0]], version[1], '0'].join('.')}"
67
else
68
minor_version = (version[1].to_i - 1)
69
tags = git.tags.map(&:name)
70
tag = language ? tags.reverse.find { |t| t.match?(/selenium-4\.#{minor_version}.*-#{language}/) } : nil
71
tag || "selenium-#{[[version[0]], minor_version, '0'].join('.')}"
72
end
73
end
74
75
def self.cdp_versions
76
Dir.glob('common/devtools/chromium/v*/')
77
.map { |d| File.basename(d) }
78
.sort_by { |v| v.delete_prefix('v').to_i }
79
end
80
81
def self.update_changelog(version, language, path, changelog, header)
82
tag = previous_tag(version, language)
83
bullet = language == 'javascript' ? '-' : '*'
84
skip_patterns = /^(bump|update.*version|Bumping to nightly)/i
85
tags_to_remove = /\[(dotnet|rb|py|java|js|rust)\]:?\s?/
86
87
command = "git log #{tag}...HEAD --pretty=format:'%s' --reverse -- #{path}"
88
log = `#{command}`
89
raise "Failed to generate changelog: #{command}" unless $CHILD_STATUS.success?
90
91
entries = log.lines
92
.map(&:strip)
93
.grep(/\(#\d+\)/)
94
.grep_v(skip_patterns)
95
.map { |line| line.gsub(tags_to_remove, '') }
96
.map { |line| "#{bullet} #{line}" }
97
.join("\n")
98
99
if version[-1] == '0' && language != 'rust'
100
versions = cdp_versions.join(', ')
101
cdp_line = "#{bullet} Support CDP versions: #{versions}"
102
entries = entries.empty? ? cdp_line : "#{cdp_line}\n#{entries}"
103
end
104
105
content = File.read(changelog)
106
File.write(changelog, "#{header}\n#{entries}\n\n#{content}")
107
end
108
109
def self.verify_package_published(url)
110
puts "Verifying #{url}..."
111
uri = URI(url)
112
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') { |http| http.request(Net::HTTP::Get.new(uri)) }
113
raise "Package not published: #{url}" unless res.is_a?(Net::HTTPSuccess)
114
115
puts 'Verified!'
116
end
117
end
118
119