Skip to content

Commit 7fc6742

Browse files
committed
Fix the inheritance overwrites for multi-level inheritance
1 parent dc63ade commit 7fc6742

File tree

12 files changed

+116
-29
lines changed

12 files changed

+116
-29
lines changed

CHANGES.md

+6
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
# 0.8.3
2+
3+
## Fixed
4+
5+
- Fixed the inheritance overwrites for multi-level inheritance
6+
17
# 0.8.2
28

39
## Fixed

lib/spin/template.ml

+58-15
Original file line numberDiff line numberDiff line change
@@ -145,11 +145,12 @@ let read_source_template_files ?(download_git = false) source =
145145
let rec of_dec
146146
?(use_defaults = false)
147147
?(files = Hashtbl.create 256)
148-
?(ignore_configs = false)
149-
?(ignore_actions = false)
150-
?(ignore_example_commands = false)
148+
?ignore_configs
149+
?ignore_actions
150+
?ignore_example_commands
151151
~source
152152
~context
153+
~depth
153154
(dec : Dec_template.t)
154155
=
155156
let open Result.Syntax in
@@ -161,13 +162,25 @@ let rec of_dec
161162
|> Result.map_error (fun reason ->
162163
Spin_error.invalid_template ~msg:reason dec.name)
163164
in
164-
read
165+
let ignore_configs =
166+
Option.value ignore_configs ~default:base.ignore_configs
167+
in
168+
let ignore_actions =
169+
Option.value ignore_actions ~default:base.ignore_actions
170+
in
171+
let ignore_example_commands =
172+
Option.value
173+
ignore_example_commands
174+
~default:base.ignore_example_commands
175+
in
176+
read_template
165177
source
166178
~use_defaults
167179
~context
168-
~ignore_configs:base.ignore_configs
169-
~ignore_actions:base.ignore_actions
170-
~ignore_example_commands:base.ignore_example_commands
180+
~ignore_configs
181+
~ignore_actions
182+
~ignore_example_commands
183+
~depth:(depth + 1)
171184
| None ->
172185
Result.ok
173186
{ name = ""
@@ -182,6 +195,29 @@ let rec of_dec
182195
; source
183196
}
184197
in
198+
let compute_ignore v f =
199+
match depth, v, dec.base_template with
200+
| 0, _, _ ->
201+
false
202+
| _, Some x, _ ->
203+
x
204+
| _, None, Some base_template ->
205+
f base_template
206+
| _, None, None ->
207+
false
208+
in
209+
let ignore_configs =
210+
compute_ignore ignore_configs (fun x ->
211+
x.Dec_template.Base_template.ignore_configs)
212+
in
213+
let ignore_actions =
214+
compute_ignore ignore_actions (fun x ->
215+
x.Dec_template.Base_template.ignore_actions)
216+
in
217+
let ignore_example_commands =
218+
compute_ignore ignore_example_commands (fun x ->
219+
x.Dec_template.Base_template.ignore_example_commands)
220+
in
185221
let* () =
186222
if ignore_configs then
187223
Result.ok ()
@@ -235,27 +271,34 @@ let rec of_dec
235271
; source
236272
}
237273

238-
and read
274+
and read_template
239275
?(use_defaults = false)
240-
?(ignore_configs = false)
241-
?(ignore_actions = false)
242-
?(ignore_example_commands = false)
276+
?ignore_configs
277+
?ignore_actions
278+
?ignore_example_commands
243279
?context
280+
~depth
244281
source
245282
=
246283
let open Result.Syntax in
247284
let context = Option.value context ~default:(Hashtbl.create 256) in
248-
let* spin_file = read_source_spin_file source ~download_git:true in
285+
let* (spin_file : Dec_template.t) =
286+
read_source_spin_file source ~download_git:true
287+
in
249288
let* files = read_source_template_files source ~download_git:false in
250289
of_dec
251290
spin_file
252-
~ignore_configs
253-
~ignore_actions
254-
~ignore_example_commands
291+
?ignore_configs
292+
?ignore_actions
293+
?ignore_example_commands
255294
~files
256295
~context
257296
~source
258297
~use_defaults
298+
~depth
299+
300+
let read ?(use_defaults = false) ?context source =
301+
read_template ~use_defaults ?context ~depth:0 source
259302

260303
let run_actions ~path actions =
261304
let open Result.Syntax in

lib/spin/template.mli

-14
Original file line numberDiff line numberDiff line change
@@ -37,22 +37,8 @@ val read_source_template_files
3737
-> source
3838
-> ((string, string) Hashtbl.t, Spin_error.t) Result.t
3939

40-
val of_dec
41-
: ?use_defaults:bool
42-
-> ?files:(string, string) Hashtbl.t
43-
-> ?ignore_configs:bool
44-
-> ?ignore_actions:bool
45-
-> ?ignore_example_commands:bool
46-
-> source:source
47-
-> context:(string, string) Hashtbl.t
48-
-> Dec_template.t
49-
-> (t, Spin_error.t) Result.t
50-
5140
val read
5241
: ?use_defaults:bool
53-
-> ?ignore_configs:bool
54-
-> ?ignore_actions:bool
55-
-> ?ignore_example_commands:bool
5642
-> ?context:(string, string) Hashtbl.t
5743
-> source
5844
-> (t, Spin_error.t) Result.t
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
(name base)
2+
(description "Test template")
3+
4+
(example_commands
5+
(commands
6+
("make deps" "Download runtime and development dependencies.")
7+
("make build" "Build the dependencies and the project.")
8+
("make test" "Starts the test runner.")))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Hello World!

test_bin/success/inherit-multi-override.t/base/template/ignored_base_file

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
$ spin new --ignore-config subdir-2 _generated
2+
3+
🏗️ Creating a new project from test in _generated
4+
Done!
5+
6+
🎉 Success! Your project is ready at _generated
7+
8+
Here are some example commands that you can run inside this directory:
9+
10+
make build
11+
Build the dependencies and the project.
12+
13+
make test
14+
Starts the test runner.
15+
16+
Happy hacking!
17+
18+
19+
$ ls _generated
20+
base_file
21+
new_file
22+
new_file_2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
(inherit (local base))
2+
3+
(name test)
4+
(description "Test template")
5+
6+
(ignore (files ignored_base_file))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Hello World!

test_bin/success/inherit-multi-override.t/subdir-1/template/new_file_to_ignore

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
(inherit
2+
(local subdir-1)
3+
(overwrites (example_commands)))
4+
5+
(name test)
6+
(description "Test template")
7+
8+
(ignore (files new_file_to_ignore))
9+
10+
(example_commands
11+
(commands
12+
("make build" "Build the dependencies and the project.")
13+
("make test" "Starts the test runner.")))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Hello World!

0 commit comments

Comments
 (0)