When cloning the git repo: 1. Try to clone 2. If there's already a build directory reset it 3. Check the clone is valid If anything goes wrong during that process: 1. Delete the clone directory 2. Clone it again 3. Check the clone is valid Raise any errors after that
62 lines
1.9 KiB
Ruby
62 lines
1.9 KiB
Ruby
require "uri"
|
|
|
|
class Kamal::Cli::Build::Clone
|
|
attr_reader :sshkit
|
|
delegate :info, :error, :execute, :capture_with_info, to: :sshkit
|
|
|
|
def initialize(sshkit)
|
|
@sshkit = sshkit
|
|
end
|
|
|
|
def prepare
|
|
begin
|
|
clone_repo
|
|
rescue SSHKit::Command::Failed => e
|
|
if e.message =~ /already exists and is not an empty directory/
|
|
reset
|
|
else
|
|
raise Kamal::Cli::Build::BuildError, "Failed to clone repo: #{e.message}"
|
|
end
|
|
end
|
|
|
|
validate!
|
|
rescue Kamal::Cli::Build::BuildError => e
|
|
error "Error preparing clone: #{e.message}, deleting and retrying..."
|
|
|
|
FileUtils.rm_rf KAMAL.config.builder.clone_directory
|
|
clone_repo
|
|
validate!
|
|
end
|
|
|
|
private
|
|
def clone_repo
|
|
info "Cloning repo into build directory `#{KAMAL.config.builder.build_directory}`..."
|
|
|
|
FileUtils.mkdir_p KAMAL.config.builder.clone_directory
|
|
execute *KAMAL.builder.clone
|
|
end
|
|
|
|
def reset
|
|
info "Resetting local clone as `#{KAMAL.config.builder.build_directory}` already exists..."
|
|
|
|
KAMAL.builder.clone_reset_steps.each { |step| execute *step }
|
|
rescue SSHKit::Command::Failed => e
|
|
raise Kamal::Cli::Build::BuildError, "Failed to clone repo: #{e.message}"
|
|
end
|
|
|
|
def validate!
|
|
status = capture_with_info(*KAMAL.builder.clone_status).strip
|
|
|
|
unless status.empty?
|
|
raise Kamal::Cli::Build::BuildError, "Clone in #{KAMAL.config.builder.build_directory} is dirty, #{status}"
|
|
end
|
|
|
|
revision = capture_with_info(*KAMAL.builder.clone_revision).strip
|
|
if revision != Kamal::Git.revision
|
|
raise Kamal::Cli::Build::BuildError, "Clone in #{KAMAL.config.builder.build_directory} is not on the correct revision, expected `#{Kamal::Git.revision}` but got `#{revision}`"
|
|
end
|
|
rescue SSHKit::Command::Failed => e
|
|
raise Kamal::Cli::Build::BuildError, "Failed to validate clone: #{e.message}"
|
|
end
|
|
end
|