This commit is contained in:
Erik Flodin 2021-12-27 21:03:19 +00:00 committed by GitHub
commit ad04e4baff
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 136 additions and 143 deletions

View File

@ -22,6 +22,7 @@ def test_bootstrap(
paths.bootstrap.write(
'#!/bin/bash\n'
f'echo {expect}\n'
f'[[ $(id -un) = $YADM_USER ]] && echo "user is set"\n'
f'exit {code}\n'
)
paths.bootstrap.chmod(0o775)
@ -30,6 +31,7 @@ def test_bootstrap(
if exists and executable:
assert run.err == ''
assert expect in run.out
assert 'user is set' in run.out
else:
assert expect in run.err
assert run.out == ''

View File

@ -2,11 +2,6 @@
import pytest
INIT_VARS = """
score=0
local_class=testclass
local_system=testsystem
local_host=testhost
local_user=testuser
alt_scores=()
alt_targets=()
alt_sources=()

View File

@ -10,7 +10,7 @@ CONDITION = {
'labels': ['a', 'arch', 'architecture'],
'modifier': 1,
},
'system': {
'os': {
'labels': ['o', 'os'],
'modifier': 2,
},
@ -54,9 +54,9 @@ def calculate_score(filename):
else:
score = 0
break
elif label in CONDITION['system']['labels']:
if value == 'testsystem':
score += 1000 + CONDITION['system']['modifier']
elif label in CONDITION['os']['labels']:
if value == 'testos':
score += 1000 + CONDITION['os']['modifier']
else:
score = 0
break
@ -95,7 +95,7 @@ def calculate_score(filename):
@pytest.mark.parametrize(
'arch', ['arch', None], ids=['arch', 'no-arch'])
@pytest.mark.parametrize(
'system', ['system', None], ids=['system', 'no-system'])
'system', ['os', None], ids=['os', 'no-os'])
@pytest.mark.parametrize(
'distro', ['distro', None], ids=['distro', 'no-distro'])
@pytest.mark.parametrize(
@ -110,9 +110,9 @@ def test_score_values(
# pylint: disable=too-many-branches
local_class = 'testclass'
local_arch = 'testarch'
local_system = 'testsystem'
local_os = 'testos'
local_distro = 'testdistro'
local_host = 'testhost'
local_hostname = 'testhost'
local_user = 'testuser'
filenames = {'filename##': 0}
@ -145,7 +145,7 @@ def test_score_values(
newfile += ','
newfile += '.'.join([
label,
local_system if match else 'badsys'
local_os if match else 'bados'
])
filenames[newfile] = calculate_score(newfile)
if distro:
@ -181,7 +181,7 @@ def test_score_values(
newfile += ','
newfile += '.'.join([
label,
local_host if match else 'badhost'
local_hostname if match else 'badhost'
])
filenames[newfile] = calculate_score(newfile)
if user:
@ -200,12 +200,12 @@ def test_score_values(
script = f"""
YADM_TEST=1 source {yadm}
score=0
local_class={local_class}
local_arch={local_arch}
local_system={local_system}
local_distro={local_distro}
local_host={local_host}
local_user={local_user}
YADM_CLASS={local_class}
YADM_ARCH={local_arch}
YADM_OS={local_os}
YADM_DISTRO={local_distro}
YADM_HOSTNAME={local_hostname}
YADM_USER={local_user}
"""
expected = ''
for filename in filenames:
@ -233,7 +233,7 @@ def test_extensions(runner, yadm, ext):
script = f"""
YADM_TEST=1 source {yadm}
score=0
local_user={local_user}
YADM_USER={local_user}
score_file "{filename}"
echo "$score"
"""
@ -248,9 +248,9 @@ def test_score_values_templates(runner, yadm):
"""Test score results"""
local_class = 'testclass'
local_arch = 'arch'
local_system = 'testsystem'
local_os = 'testos'
local_distro = 'testdistro'
local_host = 'testhost'
local_hostname = 'testhost'
local_user = 'testuser'
filenames = {'filename##': 0}
@ -265,12 +265,12 @@ def test_score_values_templates(runner, yadm):
script = f"""
YADM_TEST=1 source {yadm}
score=0
local_class={local_class}
local_arch={local_arch}
local_system={local_system}
local_distro={local_distro}
local_host={local_host}
local_user={local_user}
YADM_CLASS={local_class}
YADM_ARCH={local_arch}
YADM_OS={local_os}
YADM_DISTRO={local_distro}
YADM_HOSTNAME={local_hostname}
YADM_USER={local_user}
"""
expected = ''
for filename in filenames:

View File

@ -1,4 +1,4 @@
"""Unit tests: set_local_alt_values"""
"""Unit tests: set_alt_values"""
import pytest
import utils
@ -20,18 +20,18 @@ import utils
]
)
@pytest.mark.usefixtures('ds1_copy')
def test_set_local_alt_values(
def test_set_alt_values(
runner, yadm, paths, tst_sys, tst_host, tst_user, override):
"""Use issue_legacy_path_warning"""
script = f"""
YADM_TEST=1 source {yadm} &&
set_operating_system &&
YADM_DIR={paths.yadm} YADM_DATA={paths.data} configure_paths &&
set_local_alt_values
echo "class='$local_class'"
echo "os='$local_system'"
echo "host='$local_host'"
echo "user='$local_user'"
ALT_VALUES_SET=0 set_alt_values
echo "class='$YADM_CLASS'"
echo "os='$YADM_OS'"
echo "host='$YADM_HOSTNAME'"
echo "user='$YADM_USER'"
"""
if override:
@ -69,8 +69,8 @@ def test_distro(runner, yadm):
YADM_TEST=1 source {yadm}
function config() {{ echo "$1"; }}
function query_distro() {{ echo "testdistro"; }}
set_local_alt_values
echo "distro='$local_distro'"
ALT_VALUES_SET=0 set_alt_values
echo "distro='$YADM_DISTRO'"
"""
run = runner(command=['bash'], inp=script)
assert run.success

View File

@ -6,8 +6,8 @@ FILE_MODE = 0o754
# these values are also testing the handling of bizarre characters
LOCAL_CLASS = "default_Test+@-!^Class"
LOCAL_ARCH = "default_Test+@-!^Arch"
LOCAL_SYSTEM = "default_Test+@-!^System"
LOCAL_HOST = "default_Test+@-!^Host"
LOCAL_OS = "default_Test+@-!^System"
LOCAL_HOSTNAME = "default_Test+@-!^Host"
LOCAL_USER = "default_Test+@-!^User"
LOCAL_DISTRO = "default_Test+@-!^Distro"
TEMPLATE = f'''
@ -47,7 +47,7 @@ wrong arch 2
{{% if yadm.os == "wrongos1" %}}
wrong os 1
{{% endif %}}
{{% if yadm.os == "{LOCAL_SYSTEM}" %}}
{{% if yadm.os == "{LOCAL_OS}" %}}
Included section for os = {{{{yadm.os}}}} ({{{{yadm.os}}}} repeated)
{{% endif %}}
{{% if yadm.os == "wrongos2" %}}
@ -56,7 +56,7 @@ wrong os 2
{{% if yadm.hostname == "wronghost1" %}}
wrong host 1
{{% endif %}}
{{% if yadm.hostname == "{LOCAL_HOST}" %}}
{{% if yadm.hostname == "{LOCAL_HOSTNAME}" %}}
Included section for host = {{{{yadm.hostname}}}} ({{{{yadm.hostname}}}} again)
{{% endif %}}
{{% if yadm.hostname == "wronghost2" %}}
@ -86,16 +86,16 @@ EXPECTED = f'''
start of template
default class = >{LOCAL_CLASS}<
default arch = >{LOCAL_ARCH}<
default os = >{LOCAL_SYSTEM}<
default host = >{LOCAL_HOST}<
default os = >{LOCAL_OS}<
default host = >{LOCAL_HOSTNAME}<
default user = >{LOCAL_USER}<
default distro = >{LOCAL_DISTRO}<
Included section from else
Included section for class = {LOCAL_CLASS} ({LOCAL_CLASS} repeated)
Multiple lines
Included section for arch = {LOCAL_ARCH} ({LOCAL_ARCH} repeated)
Included section for os = {LOCAL_SYSTEM} ({LOCAL_SYSTEM} repeated)
Included section for host = {LOCAL_HOST} ({LOCAL_HOST} again)
Included section for os = {LOCAL_OS} ({LOCAL_OS} repeated)
Included section for host = {LOCAL_HOSTNAME} ({LOCAL_HOSTNAME} again)
Included section for user = {LOCAL_USER} ({LOCAL_USER} repeated)
Included section for distro = {LOCAL_DISTRO} ({LOCAL_DISTRO} again)
end of template
@ -149,12 +149,12 @@ def test_template_default(runner, yadm, tmpdir):
script = f"""
YADM_TEST=1 source {yadm}
set_awk
local_class="{LOCAL_CLASS}"
local_arch="{LOCAL_ARCH}"
local_system="{LOCAL_SYSTEM}"
local_host="{LOCAL_HOST}"
local_user="{LOCAL_USER}"
local_distro="{LOCAL_DISTRO}"
YADM_CLASS="{LOCAL_CLASS}"
YADM_ARCH="{LOCAL_ARCH}"
YADM_OS="{LOCAL_OS}"
YADM_HOSTNAME="{LOCAL_HOSTNAME}"
YADM_USER="{LOCAL_USER}"
YADM_DISTRO="{LOCAL_DISTRO}"
template_default "{input_file}" "{output_file}"
"""
run = runner(command=['bash'], inp=script)
@ -193,7 +193,7 @@ def test_include(runner, yadm, tmpdir):
basic_file = tmpdir.join('basic')
basic_file.write(INCLUDE_BASIC)
variables_file = tmpdir.join(f'variables.{LOCAL_SYSTEM}')
variables_file = tmpdir.join(f'variables.{LOCAL_OS}')
variables_file.write(INCLUDE_VARIABLES)
nested_file = tmpdir.join('dir').join('nested')
@ -207,8 +207,8 @@ def test_include(runner, yadm, tmpdir):
script = f"""
YADM_TEST=1 source {yadm}
set_awk
local_class="{LOCAL_CLASS}"
local_system="{LOCAL_SYSTEM}"
YADM_CLASS="{LOCAL_CLASS}"
YADM_OS="{LOCAL_OS}"
template_default "{input_file}" "{output_file}"
"""
run = runner(command=['bash'], inp=script)

View File

@ -5,8 +5,8 @@ FILE_MODE = 0o754
LOCAL_CLASS = "esh_Test+@-!^Class"
LOCAL_ARCH = "esh_Test+@-!^Arch"
LOCAL_SYSTEM = "esh_Test+@-!^System"
LOCAL_HOST = "esh_Test+@-!^Host"
LOCAL_OS = "esh_Test+@-!^System"
LOCAL_HOSTNAME = "esh_Test+@-!^Host"
LOCAL_USER = "esh_Test+@-!^User"
LOCAL_DISTRO = "esh_Test+@-!^Distro"
TEMPLATE = f'''
@ -38,7 +38,7 @@ wrong arch 2
<% if [ "$YADM_OS" = "wrongos1" ]; then -%>
wrong os 1
<% fi -%>
<% if [ "$YADM_OS" = "{LOCAL_SYSTEM}" ]; then -%>
<% if [ "$YADM_OS" = "{LOCAL_OS}" ]; then -%>
Included section for os = <%=$YADM_OS%> (<%=$YADM_OS%> repeated)
<% fi -%>
<% if [ "$YADM_OS" = "wrongos2" ]; then -%>
@ -47,7 +47,7 @@ wrong os 2
<% if [ "$YADM_HOSTNAME" = "wronghost1" ]; then -%>
wrong host 1
<% fi -%>
<% if [ "$YADM_HOSTNAME" = "{LOCAL_HOST}" ]; then -%>
<% if [ "$YADM_HOSTNAME" = "{LOCAL_HOSTNAME}" ]; then -%>
Included section for host = <%=$YADM_HOSTNAME%> (<%=$YADM_HOSTNAME%> again)
<% fi -%>
<% if [ "$YADM_HOSTNAME" = "wronghost2" ]; then -%>
@ -77,14 +77,14 @@ EXPECTED = f'''
start of template
esh class = >{LOCAL_CLASS}<
esh arch = >{LOCAL_ARCH}<
esh os = >{LOCAL_SYSTEM}<
esh host = >{LOCAL_HOST}<
esh os = >{LOCAL_OS}<
esh host = >{LOCAL_HOSTNAME}<
esh user = >{LOCAL_USER}<
esh distro = >{LOCAL_DISTRO}<
Included section for class = {LOCAL_CLASS} ({LOCAL_CLASS} repeated)
Included section for arch = {LOCAL_ARCH} ({LOCAL_ARCH} repeated)
Included section for os = {LOCAL_SYSTEM} ({LOCAL_SYSTEM} repeated)
Included section for host = {LOCAL_HOST} ({LOCAL_HOST} again)
Included section for os = {LOCAL_OS} ({LOCAL_OS} repeated)
Included section for host = {LOCAL_HOSTNAME} ({LOCAL_HOSTNAME} again)
Included section for user = {LOCAL_USER} ({LOCAL_USER} repeated)
Included section for distro = {LOCAL_DISTRO} ({LOCAL_DISTRO} again)
end of template
@ -107,12 +107,12 @@ def test_template_esh(runner, yadm, tmpdir):
script = f"""
YADM_TEST=1 source {yadm}
local_class="{LOCAL_CLASS}"
local_arch="{LOCAL_ARCH}"
local_system="{LOCAL_SYSTEM}"
local_host="{LOCAL_HOST}"
local_user="{LOCAL_USER}"
local_distro="{LOCAL_DISTRO}"
export YADM_CLASS="{LOCAL_CLASS}"
export YADM_ARCH="{LOCAL_ARCH}"
export YADM_OS="{LOCAL_OS}"
export YADM_HOSTNAME="{LOCAL_HOSTNAME}"
export YADM_USER="{LOCAL_USER}"
export YADM_DISTRO="{LOCAL_DISTRO}"
template_esh "{input_file}" "{output_file}"
"""
run = runner(command=['bash'], inp=script)

View File

@ -6,8 +6,8 @@ FILE_MODE = 0o754
LOCAL_CLASS = "j2_Test+@-!^Class"
LOCAL_ARCH = "j2_Test+@-!^Arch"
LOCAL_SYSTEM = "j2_Test+@-!^System"
LOCAL_HOST = "j2_Test+@-!^Host"
LOCAL_OS = "j2_Test+@-!^System"
LOCAL_HOSTNAME = "j2_Test+@-!^Host"
LOCAL_USER = "j2_Test+@-!^User"
LOCAL_DISTRO = "j2_Test+@-!^Distro"
TEMPLATE = f'''
@ -39,7 +39,7 @@ wrong arch 2
{{%- if YADM_OS == "wrongos1" %}}
wrong os 1
{{%- endif %}}
{{%- if YADM_OS == "{LOCAL_SYSTEM}" %}}
{{%- if YADM_OS == "{LOCAL_OS}" %}}
Included section for os = {{{{YADM_OS}}}} ({{{{YADM_OS}}}} repeated)
{{%- endif %}}
{{%- if YADM_OS == "wrongos2" %}}
@ -48,7 +48,7 @@ wrong os 2
{{%- if YADM_HOSTNAME == "wronghost1" %}}
wrong host 1
{{%- endif %}}
{{%- if YADM_HOSTNAME == "{LOCAL_HOST}" %}}
{{%- if YADM_HOSTNAME == "{LOCAL_HOSTNAME}" %}}
Included section for host = {{{{YADM_HOSTNAME}}}} ({{{{YADM_HOSTNAME}}}} again)
{{%- endif %}}
{{%- if YADM_HOSTNAME == "wronghost2" %}}
@ -78,14 +78,14 @@ EXPECTED = f'''
start of template
j2 class = >{LOCAL_CLASS}<
j2 arch = >{LOCAL_ARCH}<
j2 os = >{LOCAL_SYSTEM}<
j2 host = >{LOCAL_HOST}<
j2 os = >{LOCAL_OS}<
j2 host = >{LOCAL_HOSTNAME}<
j2 user = >{LOCAL_USER}<
j2 distro = >{LOCAL_DISTRO}<
Included section for class = {LOCAL_CLASS} ({LOCAL_CLASS} repeated)
Included section for arch = {LOCAL_ARCH} ({LOCAL_ARCH} repeated)
Included section for os = {LOCAL_SYSTEM} ({LOCAL_SYSTEM} repeated)
Included section for host = {LOCAL_HOST} ({LOCAL_HOST} again)
Included section for os = {LOCAL_OS} ({LOCAL_OS} repeated)
Included section for host = {LOCAL_HOSTNAME} ({LOCAL_HOSTNAME} again)
Included section for user = {LOCAL_USER} ({LOCAL_USER} repeated)
Included section for distro = {LOCAL_DISTRO} ({LOCAL_DISTRO} again)
end of template
@ -109,12 +109,12 @@ def test_template_j2(runner, yadm, tmpdir, processor):
script = f"""
YADM_TEST=1 source {yadm}
local_class="{LOCAL_CLASS}"
local_arch="{LOCAL_ARCH}"
local_system="{LOCAL_SYSTEM}"
local_host="{LOCAL_HOST}"
local_user="{LOCAL_USER}"
local_distro="{LOCAL_DISTRO}"
export YADM_CLASS="{LOCAL_CLASS}"
export YADM_ARCH="{LOCAL_ARCH}"
export YADM_OS="{LOCAL_OS}"
export YADM_HOSTNAME="{LOCAL_HOSTNAME}"
export YADM_USER="{LOCAL_USER}"
export YADM_DISTRO="{LOCAL_DISTRO}"
template_{processor} "{input_file}" "{output_file}"
"""
run = runner(command=['bash'], inp=script)

107
yadm
View File

@ -63,6 +63,7 @@ ENCRYPT_INCLUDE_FILES="unparsed"
LEGACY_WARNING_ISSUED=0
INVALID_ALT=()
ALT_VALUES_SET="${YADM_TEST:-0}"
GPG_OPTS=()
OPENSSL_OPTS=()
@ -190,42 +191,42 @@ function score_file() {
score=$((score + 0))
# variable conditions
elif [[ "$label" =~ ^(a|arch|architecture)$ ]]; then
if [ "$value" = "$local_arch" ]; then
if [ "$value" = "$YADM_ARCH" ]; then
score=$((score + 1))
else
score=0
return
fi
elif [[ "$label" =~ ^(o|os)$ ]]; then
if [ "$value" = "$local_system" ]; then
if [ "$value" = "$YADM_OS" ]; then
score=$((score + 2))
else
score=0
return
fi
elif [[ "$label" =~ ^(d|distro)$ ]]; then
if [ "$value" = "$local_distro" ]; then
if [ "$value" = "$YADM_DISTRO" ]; then
score=$((score + 4))
else
score=0
return
fi
elif [[ "$label" =~ ^(c|class)$ ]]; then
if [ "$value" = "$local_class" ]; then
if [ "$value" = "$YADM_CLASS" ]; then
score=$((score + 8))
else
score=0
return
fi
elif [[ "$label" =~ ^(h|hostname)$ ]]; then
if [ "$value" = "$local_host" ]; then
if [ "$value" = "$YADM_HOSTNAME" ]; then
score=$((score + 16))
else
score=0
return
fi
elif [[ "$label" =~ ^(u|user)$ ]]; then
if [ "$value" = "$local_user" ]; then
if [ "$value" = "$YADM_USER" ]; then
score=$((score + 32))
else
score=0
@ -367,7 +368,7 @@ BEGIN {
c["class"] = class
c["arch"] = arch
c["os"] = os
c["hostname"] = host
c["hostname"] = hostname
c["user"] = user
c["distro"] = distro
c["source"] = source
@ -431,12 +432,12 @@ function conditions() {
EOF
"${AWK_PROGRAM[0]}" \
-v class="$local_class" \
-v arch="$local_arch" \
-v os="$local_system" \
-v host="$local_host" \
-v user="$local_user" \
-v distro="$local_distro" \
-v class="$YADM_CLASS" \
-v arch="$YADM_ARCH" \
-v os="$YADM_OS" \
-v hostname="$YADM_HOSTNAME" \
-v user="$YADM_USER" \
-v distro="$YADM_DISTRO" \
-v source="$input" \
-v source_dir="$(dirname "$input")" \
"$awk_pgm" \
@ -450,13 +451,7 @@ function template_j2cli() {
output="$2"
temp_file="${output}.$$.$RANDOM"
YADM_CLASS="$local_class" \
YADM_ARCH="$local_arch" \
YADM_OS="$local_system" \
YADM_HOSTNAME="$local_host" \
YADM_USER="$local_user" \
YADM_DISTRO="$local_distro" \
YADM_SOURCE="$input" \
YADM_SOURCE="$input" \
"$J2CLI_PROGRAM" "$input" -o "$temp_file"
move_file "$input" "$output" "$temp_file"
@ -467,13 +462,7 @@ function template_envtpl() {
output="$2"
temp_file="${output}.$$.$RANDOM"
YADM_CLASS="$local_class" \
YADM_ARCH="$local_arch" \
YADM_OS="$local_system" \
YADM_HOSTNAME="$local_host" \
YADM_USER="$local_user" \
YADM_DISTRO="$local_distro" \
YADM_SOURCE="$input" \
YADM_SOURCE="$input" \
"$ENVTPL_PROGRAM" --keep-template "$input" -o "$temp_file"
move_file "$input" "$output" "$temp_file"
@ -484,14 +473,8 @@ function template_esh() {
output="$2"
temp_file="${output}.$$.$RANDOM"
"$ESH_PROGRAM" -o "$temp_file" "$input" \
YADM_CLASS="$local_class" \
YADM_ARCH="$local_arch" \
YADM_OS="$local_system" \
YADM_HOSTNAME="$local_host" \
YADM_USER="$local_user" \
YADM_DISTRO="$local_distro" \
YADM_SOURCE="$input"
YADM_SOURCE="$input" \
"$ESH_PROGRAM" -o "$temp_file" "$input"
move_file "$input" "$output" "$temp_file"
}
@ -520,13 +503,7 @@ function alt() {
parse_encrypt
# gather values for processing alternates
local local_class
local local_arch
local local_system
local local_host
local local_user
local local_distro
set_local_alt_values
set_alt_values
# only be noisy if the "alt" command was run directly
local loud=
@ -618,32 +595,42 @@ function remove_stale_links() {
fi
}
function set_local_alt_values() {
function set_alt_values() {
local_class="$(config local.class)"
[[ $ALT_VALUES_SET = 1 ]] && return
ALT_VALUES_SET=1
local_arch="$(config local.arch)"
if [ -z "$local_arch" ] ; then
local_arch=$(uname -m)
export YADM_CLASS
export YADM_ARCH
export YADM_OS
export YADM_HOSTNAME
export YADM_USER
export YADM_DISTRO
YADM_CLASS="$(config local.class)"
YADM_ARCH="$(config local.arch)"
if [ -z "$YADM_ARCH" ] ; then
YADM_ARCH=$(uname -m)
fi
local_system="$(config local.os)"
if [ -z "$local_system" ] ; then
local_system="$OPERATING_SYSTEM"
YADM_OS="$(config local.os)"
if [ -z "$YADM_OS" ] ; then
YADM_OS="$OPERATING_SYSTEM"
fi
local_host="$(config local.hostname)"
if [ -z "$local_host" ] ; then
local_host=$(uname -n)
local_host=${local_host%%.*} # trim any domain from hostname
YADM_HOSTNAME="$(config local.hostname)"
if [ -z "$YADM_HOSTNAME" ] ; then
YADM_HOSTNAME=$(uname -n)
YADM_HOSTNAME=${YADM_HOSTNAME%%.*} # trim any domain from hostname
fi
local_user="$(config local.user)"
if [ -z "$local_user" ] ; then
local_user=$(id -u -n)
YADM_USER="$(config local.user)"
if [ -z "$YADM_USER" ] ; then
YADM_USER=$(id -u -n)
fi
local_distro="$(query_distro)"
YADM_DISTRO="$(query_distro)"
}
@ -715,6 +702,8 @@ function bootstrap() {
# GIT_DIR should not be set for user's bootstrap code
unset GIT_DIR
set_alt_values
echo "Executing $YADM_BOOTSTRAP"
exec "$YADM_BOOTSTRAP"
@ -1787,6 +1776,8 @@ function invoke_hook() {
export -f unix_path
export -f mixed_path
set_alt_values
"$hook_command"
hook_status=$?

9
yadm.1
View File

@ -112,7 +112,9 @@ to "false".
.B bootstrap
Execute
.I $HOME/.config/yadm/bootstrap
if it exists.
if it exists. The variables that are set when processing Jinja or ESH templates
(see the TEMPLATES section) are set in the environment (except for
.IR YADM_SOURCE ).
.TP
.BI clone " url
Clone a remote repository for tracking dotfiles.
@ -876,7 +878,10 @@ will never be run. This allows one to "short-circuit" any operation using a
.I pre_
hook.
Hooks have the following environment variables available to them at runtime:
Hooks have the following variables, plus the variables set when processing
Jinja or ESH templates (see the TEMPLATES section), available to them as
environment variables at runtime (except for
.IR YADM_SOURCE ).
.TP
.B YADM_HOOK_COMMAND
The command which triggered the hook