Skip to content

Copy folder structure between context #124

@bleuse

Description

@bleuse

I need to copy a folder between two contexts.
There exists some aliases relying on cat to copy given files (e.g., local2in).

Following this idea, I tried to transfer the folder structure with tar:


- pipe:
  - exec_local: tar --create --directory=$${kameleon_data_dir} -- xpctl
  - exec_in: tar --directory=$${dest} --extract

where xpctl is the folder I want to copy.

The --directory option of tar change to the directory before performing any operation (as documented in tar manual).
It is required, otherwise tar includes the full path to my folder, and the extraction in the other context is not correctly located.

This snippet fails with the following error (verbose output enabled):

[info] Looking for data ' -- xpctl'
[info] /path/to/kameleon/recipe/steps/data/ -- xpctl : nonexistent
[info] /path/to/kameleon/recipe/steps/data/ -- xpctl : nonexistent
Error: Cannot find data ' -- xpctl' used in '/path/to/kameleon/recipe/steps/setup/xpctl.yaml'

Digging a bit deeper into kameleon code base, this seems related to the regexp (see l. 21 & l. 24) used in resolve_data_dir_vars:

def self.resolve_data_dir_vars(raw, yaml_path, initial_variables, recipe, kwargs)
raw.to_s.scan(/\$\$kameleon\_data\_dir\/(.*)/) do |var|
warn_var(var)
end
reg = %r/(\$\$kameleon\_data\_dir|\$\${kameleon\_data\_dir})(.*)/
matches = raw.to_enum(:scan, reg).map { Regexp.last_match }
matches.each do |m|
unless m.nil?
path = resolve_simple_vars(m[2], yaml_path, initial_variables, kwargs)
resolved_path = recipe.resolve_data_path(path.chomp('"'), yaml_path)
raw.gsub!(m[0].chomp('"'), "#{resolved_path}")
end
end
return raw
end

The regexp ends with (.*), and forbid the use of $${kameleon_data_dir} on its own.
Patching the regexp to end with (\S*) seemed to make the recipe works, but it changes the semantic, and forbids paths containing spaces to be used.
Maybe the regexp ((\S|\\\s)*) would be better by allowing spaces to be used when properly escaped.


If there is a simpler solution to copy the whole folder, I'm happy with it too 😃

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions