Commit 7acfdce0 authored by Rémy Coutable's avatar Rémy Coutable

Merge branch 'sh-fix-regenerate-schema-shallow-fork' into 'master'

Fix db:check-schema in forks and shallow clones

Closes #216214

See merge request gitlab-org/gitlab!30950
parents 09a8c054 d9b5d95b
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
# frozen_string_literal: true # frozen_string_literal: true
require 'net/http' require 'open3'
require 'uri' require 'uri'
class SchemaRegenerator class SchemaRegenerator
...@@ -56,35 +56,15 @@ class SchemaRegenerator ...@@ -56,35 +56,15 @@ class SchemaRegenerator
# Get clean schema from remote servers # Get clean schema from remote servers
# #
# This script might run in CI, using a shallow clone, so to checkout # This script might run in CI, using a shallow clone, so to checkout
# the file, download it from the server. # the file, fetch the target branch from the server.
def remote_checkout_clean_schema def remote_checkout_clean_schema
return false unless project_url return false unless project_url
return false unless target_project_url
uri = URI.join("#{project_url}/", 'raw/', "#{merge_base}/", FILENAME) run %Q[git remote add target_project #{target_project_url}.git]
run %Q[git fetch target_project #{target_branch}:#{target_branch}]
download_schema(uri) local_checkout_clean_schema
end
##
# Download the schema from the given +uri+.
def download_schema(uri)
puts "Downloading #{uri}..."
Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
request = Net::HTTP::Get.new(uri.request_uri)
http.read_timeout = 500
http.request(request) do |response|
raise("Failed to download file: #{response.code} #{response.message}") if response.code.to_i != 200
File.open(FILENAME, 'w') do |io|
response.read_body do |chunk|
io.write(chunk)
end
end
end
end
true
end end
## ##
...@@ -150,15 +130,17 @@ class SchemaRegenerator ...@@ -150,15 +130,17 @@ class SchemaRegenerator
# When the command failed an exception is raised. # When the command failed an exception is raised.
def run(cmd) def run(cmd)
puts "\e[32m$ #{cmd}\e[37m" puts "\e[32m$ #{cmd}\e[37m"
ret = system(cmd) stdout_str, stderr_str, status = Open3.capture3(cmd)
puts "\e[0m" puts "#{stdout_str}#{stderr_str}\e[0m"
raise("Command failed") unless ret raise("Command failed: #{stderr_str}") unless status.success?
stdout_str
end end
## ##
# Return the base commit between source and target branch. # Return the base commit between source and target branch.
def merge_base def merge_base
@merge_base ||= `git merge-base #{target_branch} #{source_ref}`.chomp @merge_base ||= run("git merge-base #{target_branch} #{source_ref}").chomp
end end
## ##
...@@ -179,11 +161,17 @@ class SchemaRegenerator ...@@ -179,11 +161,17 @@ class SchemaRegenerator
end end
## ##
# Return the project URL from CI environment variable. # Return the source project URL from CI environment variable.
def project_url def project_url
ENV['CI_PROJECT_URL'] ENV['CI_PROJECT_URL']
end end
##
# Return the target project URL from CI environment variable.
def target_project_url
ENV['CI_MERGE_REQUEST_PROJECT_URL']
end
## ##
# Return whether the script is running from CI # Return whether the script is running from CI
def ci? def ci?
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment