diff --git a/app/models/deploy.rb b/app/models/deploy.rb index 87f1e53..ac95a5f 100644 --- a/app/models/deploy.rb +++ b/app/models/deploy.rb @@ -36,6 +36,9 @@ class Deploy < ApplicationRecord validates :hostname, uniqueness: true # Cada deploy puede implementar su propia validación validates :hostname, hostname: true, unless: :implements_hostname_validation? + # Verificar que se puede cambiar de lugar el destino y no hay nada + # preexistente. + validate :destination_can_change?, if: :destination_changed? # Retrocompatibilidad: Encuentra el site_name a partir del hostname. # @@ -204,6 +207,19 @@ class Deploy < ApplicationRecord ad.deploy if ad.persisted? end + # Devuelve un error si el destino ya existe. No debería fallar si ya + # pasamos la validación de cambio de nombres, pero siempre puede haber + # directorios y links sueltos. + def destination_can_change? + return true unless persisted? + + remove_destination! if broken? + + return true unless exist? + + errors.add :hostname, I18n.t('activerecord.errors.models.deploy.attributes.hostname.destination_exist') + end + # Convierte el comando en una versión resumida. # # @param [String] diff --git a/test/models/site/deployment_test.rb b/test/models/site/deployment_test.rb index b8e8464..f2e73c6 100644 --- a/test/models/site/deployment_test.rb +++ b/test/models/site/deployment_test.rb @@ -64,4 +64,13 @@ class Site::DeploymentTest < ActiveSupport::TestCase assert_equal q, site.deploys.count end + + test 'no se puede cambiar el nombre si ya existía un archivo en el mismo lugar' do + assert site.deploy_local.deploy + + new_name = "test-#{SecureRandom.hex}" + FileUtils.mkdir File.join(Rails.root, '_deploy', "#{new_name}.#{Site.domain}") + + assert_not site.update(name: new_name) + end end