module Kamal::Commands::App::Assets

def clean_up_assets

def clean_up_assets
  chain \
    find_and_remove_older_siblings(role_config.asset_extracted_path),
    find_and_remove_older_siblings(role_config.asset_volume_path)
end

def copy_contents(source, destination, continue_on_error: false)

def copy_contents(source, destination, continue_on_error: false)
  [ :cp, "-rnT", "#{source}", destination, *("|| true" if continue_on_error)]
end

def extract_assets

def extract_assets
  asset_container = "#{role_config.container_prefix}-assets"
  combine \
    make_directory(role_config.asset_extracted_path),
    [*docker(:stop, "-t 1", asset_container, "2> /dev/null"), "|| true"],
    docker(:run, "--name", asset_container, "--detach", "--rm", config.latest_image, "sleep 1000000"),
    docker(:cp, "-L", "#{asset_container}:#{role_config.asset_path}/.", role_config.asset_extracted_path),
    docker(:stop, "-t 1", asset_container),
    by: "&&"
end

def find_and_remove_older_siblings(path)

def find_and_remove_older_siblings(path)
  [
    :find,
    Pathname.new(path).dirname.to_s,
    "-maxdepth 1",
    "-name", "'#{role_config.container_prefix}-*'",
    "!", "-name", Pathname.new(path).basename.to_s,
    "-exec rm -rf \"{}\" +"
  ]
end

def sync_asset_volumes(old_version: nil)

def sync_asset_volumes(old_version: nil)
  new_extracted_path, new_volume_path = role_config.asset_extracted_path(config.version), role_config.asset_volume.host_path
  if old_version.present?
    old_extracted_path, old_volume_path = role_config.asset_extracted_path(old_version), role_config.asset_volume(old_version).host_path
  end
  commands = [make_directory(new_volume_path), copy_contents(new_extracted_path, new_volume_path)]
  if old_version.present?
    commands << copy_contents(new_extracted_path, old_volume_path, continue_on_error: true)
    commands << copy_contents(old_extracted_path, new_volume_path, continue_on_error: true)
  end
  chain *commands
end