diff --git a/test/test_alt.py b/test/test_alt.py index e8a0001..b446c2c 100644 --- a/test/test_alt.py +++ b/test/test_alt.py @@ -49,13 +49,14 @@ def test_alt_source( @pytest.mark.parametrize('suffix', [ '##default', '##o.$tst_sys', '##os.$tst_sys', + '##d.$tst_distro', '##distro.$tst_distro', '##c.$tst_class', '##class.$tst_class', '##h.$tst_host', '##hostname.$tst_host', '##u.$tst_user', '##user.$tst_user', ]) def test_alt_conditions( runner, yadm_y, paths, - tst_sys, tst_host, tst_user, suffix): + tst_sys, tst_distro, tst_host, tst_user, suffix): """Test conditions supported by yadm alt""" # set the class @@ -64,6 +65,7 @@ def test_alt_conditions( suffix = string.Template(suffix).substitute( tst_sys=tst_sys, + tst_distro=tst_distro, tst_class=tst_class, tst_host=tst_host, tst_user=tst_user, diff --git a/test/test_unit_score_file.py b/test/test_unit_score_file.py index 122d580..5719fe4 100644 --- a/test/test_unit_score_file.py +++ b/test/test_unit_score_file.py @@ -10,17 +10,21 @@ CONDITION = { 'labels': ['o', 'os'], 'modifier': 1, }, + 'distro': { + 'labels': ['d', 'distro'], + 'modifier': 2, + }, 'class': { 'labels': ['c', 'class'], - 'modifier': 2, + 'modifier': 4, }, 'hostname': { 'labels': ['h', 'hostname'], - 'modifier': 4, + 'modifier': 8, }, 'user': { 'labels': ['u', 'user'], - 'modifier': 8, + 'modifier': 16, }, } TEMPLATE_LABELS = ['t', 'template', 'yadm'] @@ -44,24 +48,35 @@ def calculate_score(filename): if value == 'testsystem': score += 1000 + CONDITION['system']['modifier'] else: - return 0 + score = 0 + break + elif label in CONDITION['distro']['labels']: + if value == 'testdistro': + score += 1000 + CONDITION['distro']['modifier'] + else: + score = 0 + break elif label in CONDITION['class']['labels']: if value == 'testclass': score += 1000 + CONDITION['class']['modifier'] else: - return 0 + score = 0 + break elif label in CONDITION['hostname']['labels']: if value == 'testhost': score += 1000 + CONDITION['hostname']['modifier'] else: - return 0 + score = 0 + break elif label in CONDITION['user']['labels']: if value == 'testuser': score += 1000 + CONDITION['user']['modifier'] else: - return 0 + score = 0 + break elif label in TEMPLATE_LABELS: - return 0 + score = 0 + break return score @@ -69,6 +84,8 @@ def calculate_score(filename): 'default', ['default', None], ids=['default', 'no-default']) @pytest.mark.parametrize( 'system', ['system', None], ids=['system', 'no-system']) +@pytest.mark.parametrize( + 'distro', ['distro', None], ids=['distro', 'no-distro']) @pytest.mark.parametrize( 'cla', ['class', None], ids=['class', 'no-class']) @pytest.mark.parametrize( @@ -76,11 +93,12 @@ def calculate_score(filename): @pytest.mark.parametrize( 'user', ['user', None], ids=['user', 'no-user']) def test_score_values( - runner, yadm, default, system, cla, host, user): + runner, yadm, default, system, distro, cla, host, user): """Test score results""" # pylint: disable=too-many-branches local_class = 'testclass' local_system = 'testsystem' + local_distro = 'testdistro' local_host = 'testhost' local_user = 'testuser' filenames = {'filename##': 0} @@ -105,6 +123,18 @@ def test_score_values( local_system if match else 'badsys' ]) filenames[newfile] = calculate_score(newfile) + if distro: + for filename in list(filenames): + for match in [True, False]: + for label in CONDITION[distro]['labels']: + newfile = filename + if not newfile.endswith('##'): + newfile += ',' + newfile += '.'.join([ + label, + local_distro if match else 'baddistro' + ]) + filenames[newfile] = calculate_score(newfile) if cla: for filename in list(filenames): for match in [True, False]: @@ -147,6 +177,7 @@ def test_score_values( score=0 local_class={local_class} local_system={local_system} + local_distro={local_distro} local_host={local_host} local_user={local_user} """ @@ -169,6 +200,7 @@ def test_score_values_templates(runner, yadm): """Test score results""" local_class = 'testclass' local_system = 'testsystem' + local_distro = 'testdistro' local_host = 'testhost' local_user = 'testuser' filenames = {'filename##': 0} @@ -186,6 +218,7 @@ def test_score_values_templates(runner, yadm): score=0 local_class={local_class} local_system={local_system} + local_distro={local_distro} local_host={local_host} local_user={local_user} """ diff --git a/yadm b/yadm index e4df305..656e508 100755 --- a/yadm +++ b/yadm @@ -154,23 +154,30 @@ function score_file() { score=0 return fi + elif [[ "$label" =~ ^(d|distro)$ ]]; then + if [ "$value" = "$local_distro" ]; then + score=$((score + 2)) + else + score=0 + return + fi elif [[ "$label" =~ ^(c|class)$ ]]; then if [ "$value" = "$local_class" ]; then - score=$((score + 2)) + score=$((score + 4)) else score=0 return fi elif [[ "$label" =~ ^(h|hostname)$ ]]; then if [ "$value" = "$local_host" ]; then - score=$((score + 4)) + score=$((score + 8)) else score=0 return fi elif [[ "$label" =~ ^(u|user)$ ]]; then if [ "$value" = "$local_user" ]; then - score=$((score + 8)) + score=$((score + 16)) else score=0 return diff --git a/yadm.1 b/yadm.1 index 1ad3e11..526b6f9 100644 --- a/yadm.1 +++ b/yadm.1 @@ -424,6 +424,11 @@ Valid if the value matches the current user. Current user is calculated by running .BR "id -u -n" . .TP +.BR distro , " d +Valid if the value matches the distro. +Distro is calculated by running +.BR "lsb_release -si" . +.TP .BR os , " o Valid if the value matches the OS. OS is calculated by running