Sha256: 97a3f4469d531433c7bc0114ea70801b83291b4729ed87a2cc3e5a2f54fe0b8d

Contents?: true

Size: 1.93 KB

Versions: 1

Compression:

Stored size: 1.93 KB

Contents

Capistrano::Configuration.instance.load do
  # configurations root directory
  config_root = File.expand_path(fetch(:config_root, "config/deploy"))

  # list of configurations files
  config_files = Dir["#{config_root}/**/*.rb"]

  # remove configuration file if it's part of another configuration
  config_files.reject! do |config_file|
    config_dir = config_file.gsub(/\.rb$/, '/')
    config_files.any? { |file| file[0, config_dir.size] == config_dir }
  end

  # build configuration names list
  config_names = config_files.map do |config_file|
    config_file.sub("#{config_root}/", '').sub(/\.rb$/, '').gsub('/', ':')
  end

  # ensure that configuration segments don't override any method, task or namespace
  config_names.each do |config_name|
    config_name.split(':').each do |segment|
      if all_methods.any? { |m| m == segment }
        raise ArgumentError,
          "Config task #{config_name} name overrides #{segment.inspect} (method|task|namespace)"
      end
    end
  end

  # create configuration task for each configuration name
  config_names.each do |config_name|
    segments = config_name.split(':')
    namespace_names = segments[0, segments.size - 1]
    task_name = segments.last

    # create configuration task block
    block = lambda do
      desc "Load #{config_name} configuration"
      task(task_name) do
        # set configuration name as :config_name variable
        self.set(:config_name, config_name)

        # recursively load configurations
        segments.size.times do |i|
          path = ([config_root] + segments[0..i]).join('/') + '.rb'
          self.load(path) if File.exists?(path)
        end
      end
    end

    # wrap task block into namespace blocks
    block = namespace_names.reverse.inject(block) do |child, name|
      lambda do
        namespace(name, &child)
      end
    end

    # create configuration task
    block.call
  end

  # set configuration names list
  set(:config_names, config_names)
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
capistrano-multiconfig-0.0.1 lib/capistrano/multiconfig/configurations.rb