google-api-ruby-client/.toys/ci.rb

130 lines
3.5 KiB
Ruby

# Copyright 2021 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
require "json"
require "set"
flag :github_event_name, "--github-event-name PATH"
flag :github_event_payload, "--github-event-payload PATH"
flag :from_commit, "--from COMMIT"
flag :only, "--only"
flag :include_spec, "--[no-]include-spec"
flag :include_yardoc, "--[no-]include-yardoc"
flag :include_build, "--[no-]include-build"
include :exec, e: true
include :terminal, styled: true
def run
set :include_spec, !only if include_spec.nil?
set :include_yardoc, !only if include_yardoc.nil?
set :include_build, !only if include_build.nil?
Dir.chdir context_directory
base_sha = find_base_sha
if base_sha.nil?
puts "No base SHA. Using local diff.", :bold
else
puts "Base SHA: #{base_sha}", :bold
end
files = find_changed_files base_sha
if files.empty?
puts "No files changed.", :bold
else
puts "Files changed:", :bold
files.each { |file| puts " #{file}" }
end
dirs = find_changed_directories files
if dirs.empty?
puts "No gem directories changed.", :bold
else
puts "Gem directories changed:", :bold
dirs.each { |dir| puts " #{dir}" }
end
dirs.each { |dir| run_in_dir dir }
end
def run_in_dir dir
Dir.chdir dir do
if include_spec
puts
puts "Running spec in #{dir}...", :bold
exec ["toys", "_nested", "spec"]
end
if include_yardoc
puts
puts "Running yardoc in #{dir}...", :bold
exec ["toys", "_nested", "yardoc"]
end
if include_build
puts
puts "Running build in #{dir}...", :bold
exec ["toys", "_nested", "build"]
end
end
end
def generated_dirs
@generated_dirs ||= Dir.glob "generated/google-apis-*"
end
def find_base_sha
case github_event_name
when "pull_request"
payload = JSON.load File.read github_event_payload
payload["pull_request"]["base"]["sha"]
when "push"
payload = JSON.load File.read github_event_payload
payload["before"]
else
from_commit
end
end
def find_changed_files base_sha
if base_sha.nil?
capture(["git", "status", "--porcelain"]).split("\n").map { |line| line.split.last }
else
result = exec(["git", "show", "--no-patch", "--format=%H", base_sha], out: :capture, err: :capture, e: false)
if result.error?
exec(["git", "fetch", "--depth=1", "origin", base_sha])
base_sha = capture(["git", "show", "--no-patch", "--format=%H", base_sha]).strip
else
base_sha = result.captured_out
end
capture(["git", "diff", "--name-only", base_sha]).split("\n").map(&:strip)
end
end
def find_changed_directories files
dirs = Set.new
files.each do |file|
case file
when %r{^generated/google-apis-discovery_v1/}
dirs << "generated/google-apis-discovery_v1" << "google-apis-generator"
when %r{^(generated/[^/]+)/}
dirs << Regexp.last_match[1]
when %r{^google-apis-core/}
dirs << "google-apis-core" << "generated/google-apis-discovery_v1"
when %r{^google-apis-generator/}
dirs << "google-apis-generator"
end
end
dirs.to_a.sort
end