Merge pull request #255 from erijo/template-awk-inc
This commit is contained in:
commit
1e6f198552
3 changed files with 97 additions and 3 deletions
|
@ -88,6 +88,36 @@ Included section for distro = {LOCAL_DISTRO} ({LOCAL_DISTRO} again)
|
||||||
end of template
|
end of template
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
INCLUDE_BASIC = 'basic\n'
|
||||||
|
INCLUDE_VARIABLES = f'''\
|
||||||
|
included <{{{{ yadm.class }}}}> file
|
||||||
|
|
||||||
|
empty line above
|
||||||
|
'''
|
||||||
|
INCLUDE_NESTED = 'no newline at the end'
|
||||||
|
|
||||||
|
TEMPLATE_INCLUDE = '''\
|
||||||
|
The first line
|
||||||
|
{% include empty %}
|
||||||
|
An empty file removes the line above
|
||||||
|
{%include basic%}
|
||||||
|
{% include "./variables.{{ yadm.os }}" %}
|
||||||
|
{% include dir/nested %}
|
||||||
|
Include basic again:
|
||||||
|
{% include basic %}
|
||||||
|
'''
|
||||||
|
EXPECTED_INCLUDE = f'''\
|
||||||
|
The first line
|
||||||
|
An empty file removes the line above
|
||||||
|
basic
|
||||||
|
included <{LOCAL_CLASS}> file
|
||||||
|
|
||||||
|
empty line above
|
||||||
|
no newline at the end
|
||||||
|
Include basic again:
|
||||||
|
basic
|
||||||
|
'''
|
||||||
|
|
||||||
|
|
||||||
def test_template_default(runner, yadm, tmpdir):
|
def test_template_default(runner, yadm, tmpdir):
|
||||||
"""Test template_default"""
|
"""Test template_default"""
|
||||||
|
@ -132,3 +162,37 @@ def test_source(runner, yadm, tmpdir):
|
||||||
assert run.err == ''
|
assert run.err == ''
|
||||||
assert output_file.read().strip() == str(input_file)
|
assert output_file.read().strip() == str(input_file)
|
||||||
assert os.stat(output_file).st_mode == os.stat(input_file).st_mode
|
assert os.stat(output_file).st_mode == os.stat(input_file).st_mode
|
||||||
|
|
||||||
|
|
||||||
|
def test_include(runner, yadm, tmpdir):
|
||||||
|
"""Test include"""
|
||||||
|
|
||||||
|
empty_file = tmpdir.join('empty')
|
||||||
|
empty_file.write('', ensure=True)
|
||||||
|
|
||||||
|
basic_file = tmpdir.join('basic')
|
||||||
|
basic_file.write(INCLUDE_BASIC)
|
||||||
|
|
||||||
|
variables_file = tmpdir.join(f'variables.{LOCAL_SYSTEM}')
|
||||||
|
variables_file.write(INCLUDE_VARIABLES)
|
||||||
|
|
||||||
|
nested_file = tmpdir.join('dir').join('nested')
|
||||||
|
nested_file.write(INCLUDE_NESTED, ensure=True)
|
||||||
|
|
||||||
|
input_file = tmpdir.join('input')
|
||||||
|
input_file.write(TEMPLATE_INCLUDE)
|
||||||
|
input_file.chmod(FILE_MODE)
|
||||||
|
output_file = tmpdir.join('output')
|
||||||
|
|
||||||
|
script = f"""
|
||||||
|
YADM_TEST=1 source {yadm}
|
||||||
|
set_awk
|
||||||
|
local_class="{LOCAL_CLASS}"
|
||||||
|
local_system="{LOCAL_SYSTEM}"
|
||||||
|
template_default "{input_file}" "{output_file}"
|
||||||
|
"""
|
||||||
|
run = runner(command=['bash'], inp=script)
|
||||||
|
assert run.success
|
||||||
|
assert run.err == ''
|
||||||
|
assert output_file.read() == EXPECTED_INCLUDE
|
||||||
|
assert os.stat(output_file).st_mode == os.stat(input_file).st_mode
|
||||||
|
|
28
yadm
28
yadm
|
@ -357,8 +357,13 @@ BEGIN {
|
||||||
els = "^{%" blank "*else" blank "*%}$"
|
els = "^{%" blank "*else" blank "*%}$"
|
||||||
end = "^{%" blank "*endif" blank "*%}$"
|
end = "^{%" blank "*endif" blank "*%}$"
|
||||||
skp = "^{%" blank "*(if|else|endif)"
|
skp = "^{%" blank "*(if|else|endif)"
|
||||||
|
inc_start = "^{%" blank "*include" blank "+\"?"
|
||||||
|
inc_end = "\"?" blank "*%}$"
|
||||||
|
inc = inc_start ".+" inc_end
|
||||||
prt = 1
|
prt = 1
|
||||||
|
err = 0
|
||||||
}
|
}
|
||||||
|
END { exit err }
|
||||||
{ replace_vars() } # variable replacements
|
{ replace_vars() } # variable replacements
|
||||||
$0 ~ vld, $0 ~ end {
|
$0 ~ vld, $0 ~ end {
|
||||||
if ($0 ~ vld || $0 ~ end) prt=1;
|
if ($0 ~ vld || $0 ~ end) prt=1;
|
||||||
|
@ -370,7 +375,25 @@ $0 ~ vld, $0 ~ end {
|
||||||
if ($0 ~ els || $0 ~ end) prt=1;
|
if ($0 ~ els || $0 ~ end) prt=1;
|
||||||
if ($0 ~ skp) next;
|
if ($0 ~ skp) next;
|
||||||
}
|
}
|
||||||
{ if (prt) print }
|
{ if (!prt) next }
|
||||||
|
$0 ~ inc {
|
||||||
|
file = $0
|
||||||
|
sub(inc_start, "", file)
|
||||||
|
sub(inc_end, "", file)
|
||||||
|
sub(/^[^\/].*$/, source_dir "/&", file)
|
||||||
|
|
||||||
|
while ((res = getline <file) > 0) {
|
||||||
|
replace_vars()
|
||||||
|
print
|
||||||
|
}
|
||||||
|
if (res < 0) {
|
||||||
|
printf "%s:%d: error: could not read '%s'\n", FILENAME, NR, file | "cat 1>&2"
|
||||||
|
err = 1
|
||||||
|
}
|
||||||
|
close(file)
|
||||||
|
next
|
||||||
|
}
|
||||||
|
{ print }
|
||||||
function replace_vars() {
|
function replace_vars() {
|
||||||
for (label in c) {
|
for (label in c) {
|
||||||
gsub(("{{" blank "*yadm\\." label blank "*}}"), c[label])
|
gsub(("{{" blank "*yadm\\." label blank "*}}"), c[label])
|
||||||
|
@ -396,8 +419,9 @@ EOF
|
||||||
-v user="$local_user" \
|
-v user="$local_user" \
|
||||||
-v distro="$local_distro" \
|
-v distro="$local_distro" \
|
||||||
-v source="$input" \
|
-v source="$input" \
|
||||||
|
-v source_dir="$(dirname "$input")" \
|
||||||
"$awk_pgm" \
|
"$awk_pgm" \
|
||||||
"$input" > "$temp_file"
|
"$input" > "$temp_file" || rm -f "$temp_file"
|
||||||
|
|
||||||
if [ -f "$temp_file" ] ; then
|
if [ -f "$temp_file" ] ; then
|
||||||
copy_perms "$input" "$temp_file"
|
copy_perms "$input" "$temp_file"
|
||||||
|
|
8
yadm.1
8
yadm.1
|
@ -708,6 +708,7 @@ with the following content
|
||||||
config={{yadm.class}}-{{yadm.os}}
|
config={{yadm.class}}-{{yadm.os}}
|
||||||
{% else %}
|
{% else %}
|
||||||
config=dev-whatever
|
config=dev-whatever
|
||||||
|
{% include "whatever.extra" %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
would output a file named
|
would output a file named
|
||||||
|
@ -716,9 +717,12 @@ with the following content if the user is "harvey":
|
||||||
|
|
||||||
config=work-Linux
|
config=work-Linux
|
||||||
|
|
||||||
and the following otherwise:
|
and the following otherwise (if
|
||||||
|
.I whatever.extra
|
||||||
|
contains admin=false):
|
||||||
|
|
||||||
config=dev-whatever
|
config=dev-whatever
|
||||||
|
admin=false
|
||||||
|
|
||||||
An equivalent Jinja template named
|
An equivalent Jinja template named
|
||||||
.I whatever##template.j2
|
.I whatever##template.j2
|
||||||
|
@ -728,6 +732,7 @@ would look like:
|
||||||
config={{YADM_CLASS}}-{{YADM_OS}}
|
config={{YADM_CLASS}}-{{YADM_OS}}
|
||||||
{% else -%}
|
{% else -%}
|
||||||
config=dev-whatever
|
config=dev-whatever
|
||||||
|
{% include 'whatever.extra' %}
|
||||||
{% endif -%}
|
{% endif -%}
|
||||||
|
|
||||||
An equivalent ESH templated named
|
An equivalent ESH templated named
|
||||||
|
@ -738,6 +743,7 @@ would look like:
|
||||||
config=<%= $YADM_CLASS %>-<%= $YADM_OS %>
|
config=<%= $YADM_CLASS %>-<%= $YADM_OS %>
|
||||||
<% else -%>
|
<% else -%>
|
||||||
config=dev-whatever
|
config=dev-whatever
|
||||||
|
<%+ whatever.extra %>
|
||||||
<% fi -%>
|
<% fi -%>
|
||||||
|
|
||||||
.SH ENCRYPTION
|
.SH ENCRYPTION
|
||||||
|
|
Loading…
Reference in a new issue