130 lines
3.5 KiB
Ruby
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
|