Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
seleniumhq
GitHub Repository: seleniumhq/selenium
Path: blob/trunk/rake_tasks/common.rb
4503 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.update_changelog(version, language, path, changelog, header)
76
tag = previous_tag(version, language)
77
bullet = language == 'javascript' ? '-' : '*'
78
skip_patterns = /^(bump|update.*version|Bumping to nightly)/i
79
tags_to_remove = /\[(dotnet|rb|py|java|js|rust)\]:?\s?/
80
81
command = "git log #{tag}...HEAD --pretty=format:'%s' --reverse -- #{path}"
82
log = `#{command}`
83
84
entries = log.lines
85
.map(&:strip)
86
.grep(/\(#\d+\)/)
87
.grep_v(skip_patterns)
88
.map { |line| line.gsub(tags_to_remove, '') }
89
.map { |line| "#{bullet} #{line}" }
90
.join("\n")
91
92
content = File.read(changelog)
93
File.write(changelog, "#{header}\n#{entries}\n\n#{content}")
94
end
95
96
def self.verify_package_published(url)
97
puts "Verifying #{url}..."
98
uri = URI(url)
99
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') { |http| http.request(Net::HTTP::Get.new(uri)) }
100
raise "Package not published: #{url}" unless res.is_a?(Net::HTTPSuccess)
101
102
puts 'Verified!'
103
end
104
end
105
106