Skip to content

Commit 366abc7

Browse files
authored
Fix field_arch not working properly (#53)
1 parent a4952e3 commit 366abc7

4 files changed

Lines changed: 205 additions & 23 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@ dist
99
*.onefile-build
1010
toltecmk
1111
env/
12+
.venv

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "toltecmk"
3-
version = "0.3.2"
3+
version = "0.3.3"
44
authors = [
55
{ name="Mattéo Delabre", email="git.matteo@delab.re" },
66
{ name="Eeems", email="eeems@eeems.email" },
Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
# Copyright (c) 2021 The Toltec Contributors
2+
# SPDX-License-Identifier: MIT
3+
4+
import os
5+
import re
6+
from os import path
7+
import unittest
8+
from tempfile import TemporaryDirectory
9+
from datetime import datetime, timezone
10+
from toltec import parse_recipe
11+
from toltec.bash import ScriptError
12+
from toltec.recipe import Package, Recipe, Source, RecipeError, RecipeWarning
13+
from toltec.version import (
14+
Version,
15+
Dependency,
16+
DependencyKind,
17+
VersionComparator,
18+
)
19+
20+
21+
class TestInstallDepends(unittest.TestCase):
22+
def setUp(self) -> None:
23+
self.dir_handle = TemporaryDirectory()
24+
self.dir = self.dir_handle.name
25+
26+
def tearDown(self) -> None:
27+
self.dir = None
28+
self.dir_handle.cleanup()
29+
30+
def test_installdepends(self) -> None:
31+
"""Check that basic fields are parsed."""
32+
rec_path = path.join(self.dir, "toltec-base")
33+
os.makedirs(rec_path)
34+
35+
with open(path.join(rec_path, "package"), "w") as rec_def_file:
36+
rec_def_file.write(
37+
"""
38+
archs=(rmall rmallos2 rmallos3 rm1 rm1os2 rm1os3 rm2 rm2os2 rm2os3)
39+
pkgnames=(toltec-base)
40+
pkgdesc="Metapackage defining the base set of packages in a Toltec install"
41+
url=https://toltec-dev.org/
42+
pkgver=1.4-1
43+
timestamp=2023-12-27T08:30Z
44+
section="utils"
45+
maintainer="Eeems <eeems@eeems.email>"
46+
license=MIT
47+
installdepends=(toltec-bootstrap toltec-deletions toltec-completion launcherctl wget-ssl ca-certificates entware-rc)
48+
installdepends_rm1os2=(open-remarkable-shutdown)
49+
installdepends_rm1os3=(open-remarkable-shutdown)
50+
installdepends_rm2os2=(rm2-suspend-fix)
51+
installdepends_rm2os3=(rm2-suspend-fix)
52+
53+
image=base:v2.1
54+
source=("https://example.org/toltec/${pkgnames[0]}/release-${pkgver%-*}.zip")
55+
sha256sums=(SKIP)
56+
57+
build() {
58+
echo "Build function"
59+
}
60+
61+
package() {
62+
echo "Package function"
63+
}
64+
"""
65+
)
66+
67+
basic_depends = [
68+
Dependency(DependencyKind.HOST, x)
69+
for x in [
70+
"toltec-bootstrap",
71+
"toltec-deletions",
72+
"toltec-completion",
73+
"launcherctl",
74+
"wget-ssl",
75+
"ca-certificates",
76+
"entware-rc",
77+
]
78+
]
79+
rm1_depends = [
80+
Dependency(DependencyKind.HOST, "open-remarkable-shutdown")
81+
]
82+
rm2_depends = [Dependency(DependencyKind.HOST, "rm2-suspend-fix")]
83+
84+
recipes = parse_recipe(rec_path)
85+
86+
self.assertEqual(
87+
list(recipes.keys()),
88+
[
89+
"rmall",
90+
"rmallos2",
91+
"rmallos3",
92+
"rm1",
93+
"rm1os2",
94+
"rm1os3",
95+
"rm2",
96+
"rm2os2",
97+
"rm2os3",
98+
],
99+
)
100+
recipe = recipes["rmall"]
101+
self.assertIs(type(recipe), Recipe)
102+
self.assertEqual(list(recipe.packages.keys()), ["toltec-base"])
103+
package = recipe.packages["toltec-base"]
104+
self.assertEqual(
105+
package.installdepends,
106+
set(basic_depends),
107+
)
108+
109+
recipe = recipes["rm1"]
110+
self.assertIs(type(recipe), Recipe)
111+
package = recipe.packages["toltec-base"]
112+
self.assertEqual(list(recipe.packages.keys()), ["toltec-base"])
113+
self.assertEqual(
114+
package.installdepends,
115+
set(basic_depends),
116+
)
117+
118+
recipe = recipes["rm2"]
119+
self.assertIs(type(recipe), Recipe)
120+
package = recipe.packages["toltec-base"]
121+
self.assertEqual(list(recipe.packages.keys()), ["toltec-base"])
122+
self.assertEqual(
123+
package.installdepends,
124+
set(basic_depends),
125+
)
126+
127+
recipe = recipes["rmallos2"]
128+
self.assertIs(type(recipe), Recipe)
129+
package = recipe.packages["toltec-base"]
130+
self.assertEqual(list(recipe.packages.keys()), ["toltec-base"])
131+
self.assertEqual(
132+
package.installdepends,
133+
set(basic_depends),
134+
)
135+
136+
recipe = recipes["rmallos3"]
137+
self.assertIs(type(recipe), Recipe)
138+
package = recipe.packages["toltec-base"]
139+
self.assertEqual(list(recipe.packages.keys()), ["toltec-base"])
140+
self.assertEqual(
141+
package.installdepends,
142+
set(basic_depends),
143+
)
144+
145+
recipe = recipes["rm1os2"]
146+
self.assertIs(type(recipe), Recipe)
147+
package = recipe.packages["toltec-base"]
148+
self.assertEqual(list(recipe.packages.keys()), ["toltec-base"])
149+
self.assertEqual(
150+
package.installdepends,
151+
set(basic_depends + rm1_depends),
152+
)
153+
154+
recipe = recipes["rm1os3"]
155+
self.assertIs(type(recipe), Recipe)
156+
package = recipe.packages["toltec-base"]
157+
self.assertEqual(list(recipe.packages.keys()), ["toltec-base"])
158+
self.assertEqual(
159+
package.installdepends,
160+
set(basic_depends + rm1_depends),
161+
)
162+
163+
recipe = recipes["rm2os2"]
164+
self.assertIs(type(recipe), Recipe)
165+
package = recipe.packages["toltec-base"]
166+
self.assertEqual(list(recipe.packages.keys()), ["toltec-base"])
167+
self.assertEqual(
168+
package.installdepends,
169+
set(basic_depends + rm2_depends),
170+
)
171+
172+
recipe = recipes["rm2os3"]
173+
self.assertIs(type(recipe), Recipe)
174+
package = recipe.packages["toltec-base"]
175+
self.assertEqual(list(recipe.packages.keys()), ["toltec-base"])
176+
self.assertEqual(
177+
package.installdepends,
178+
set(basic_depends + rm2_depends),
179+
)

toltec/recipe_parsers/bash.py

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# SPDX-License-Identifier: MIT
33
"""Parse recipes from Bash files."""
44

5+
import copy
56
import warnings
67
from itertools import product
78
from typing import Any, Dict, Generator, Iterable, Optional, Tuple
@@ -62,8 +63,8 @@ def _instantiate_arch(
6263
assert archs is not None
6364

6465
for arch in archs:
65-
loc_vars: bash.Variables = variables.copy()
66-
loc_funcs: bash.Functions = functions.copy()
66+
loc_vars: bash.Variables = copy.deepcopy(variables)
67+
loc_funcs: bash.Functions = copy.deepcopy(functions)
6768
loc_vars["arch"] = arch
6869

6970
# Merge variables suffixed with the selected architecture
@@ -88,28 +89,29 @@ def _instantiate_arch(
8889

8990
if name not in loc_vars:
9091
loc_vars[name] = value
91-
else:
92-
normal_value = loc_vars[name]
93-
94-
if isinstance(normal_value, str):
95-
if not isinstance(value, str):
96-
raise RecipeError(
97-
path,
98-
f"Field '{name}' was declared several times with \
92+
continue
93+
94+
normal_value = loc_vars[name]
95+
96+
if isinstance(normal_value, str):
97+
if not isinstance(value, str):
98+
raise RecipeError(
99+
path,
100+
f"Field '{name}' was declared several times with \
99101
different types",
100-
)
102+
)
101103

102-
loc_vars[name] = value
104+
loc_vars[name] = value
103105

104-
if isinstance(normal_value, list):
105-
if not isinstance(value, list):
106-
raise RecipeError(
107-
path,
108-
f"Field '{name}' was declared several times with \
106+
if isinstance(normal_value, list):
107+
if not isinstance(value, list):
108+
raise RecipeError(
109+
path,
110+
f"Field '{name}' was declared several times with \
109111
different types",
110-
)
112+
)
111113

112-
normal_value.extend(value)
114+
normal_value.extend(value)
113115

114116
yield arch or "", loc_vars, loc_funcs
115117

@@ -219,8 +221,8 @@ def _parse_recipe( # pylint: disable=too-many-locals, disable=too-many-statemen
219221
variables["pkgname"] = pkg_name
220222
attrs["packages"][pkg_name] = _parse_package(
221223
result,
222-
variables.copy(),
223-
raw_vars.copy(),
224+
copy.deepcopy(variables),
225+
copy.deepcopy(raw_vars),
224226
functions,
225227
)
226228
else:
@@ -254,7 +256,7 @@ def _parse_recipe( # pylint: disable=too-many-locals, disable=too-many-statemen
254256
attrs["packages"][sub_pkg_name] = _parse_package(
255257
result,
256258
pkg_vars,
257-
raw_vars.copy(),
259+
copy.deepcopy(raw_vars),
258260
{**functions, **pkg_funcs},
259261
)
260262

0 commit comments

Comments
 (0)