Skip to content

Commit 53d49d9

Browse files
authored
tools: don't interrupt resolving deps by vpm, when a module failed updating, improve detecting invalid, add update_test (#19867)
1 parent 4628fe7 commit 53d49d9

File tree

2 files changed

+64
-3
lines changed

2 files changed

+64
-3
lines changed

cmd/tools/vpm/update.v

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,22 +26,35 @@ fn vpm_update(query []string) {
2626
}
2727
mut pp := pool.new_pool_processor(callback: update_module)
2828
pp.work_on_items(modules)
29+
mut errors := 0
2930
for res in pp.get_results[ModUpdateInfo]() {
3031
if res.has_err {
31-
exit(1)
32+
errors++
33+
continue
3234
}
3335
resolve_dependencies(get_manifest(res.final_path), modules)
3436
}
37+
if errors > 0 {
38+
exit(1)
39+
}
3540
}
3641

3742
fn update_module(mut pp pool.PoolProcessor, idx int, wid int) &ModUpdateInfo {
3843
mut result := &ModUpdateInfo{
3944
name: pp.get_item[string](idx)
4045
}
4146
name := get_name_from_url(result.name) or { result.name }
42-
result.final_path = get_path_of_existing_module(result.name) or { return result }
47+
result.final_path = get_path_of_existing_module(result.name) or {
48+
vpm_error('failed to find path for `${name}`.', verbose: true)
49+
result.has_err = true
50+
return result
51+
}
4352
println('Updating module `${name}` in `${fmt_mod_path(result.final_path)}` ...')
44-
vcs := vcs_used_in_dir(result.final_path) or { return result }
53+
vcs := vcs_used_in_dir(result.final_path) or {
54+
vpm_error('failed to find version control system for `${name}`.', verbose: true)
55+
result.has_err = true
56+
return result
57+
}
4558
vcs.is_executable() or {
4659
result.has_err = true
4760
vpm_error(err.msg())

cmd/tools/vpm/update_test.v

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
// vtest flaky: true
2+
// vtest retry: 3
3+
import os
4+
5+
const (
6+
v = os.quoted_path(@VEXE)
7+
test_path = os.join_path(os.vtmp_dir(), 'vpm_update_test')
8+
)
9+
10+
fn testsuite_begin() {
11+
os.setenv('VMODULES', test_path, true)
12+
os.setenv('VPM_DEBUG', '', true)
13+
os.setenv('VPM_NO_INCREMENT', '1', true)
14+
}
15+
16+
fn testsuite_end() {
17+
os.rmdir_all(test_path) or {}
18+
}
19+
20+
// Tests if `v update` detects installed modules and runs successfully.
21+
fn test_update() {
22+
os.execute_or_exit('${v} install pcre')
23+
os.execute_or_exit('${v} install nedpals.args')
24+
os.execute_or_exit('${v} install https://github.com/spytheman/vtray')
25+
res := os.execute_opt('${v} update') or { panic(err) }
26+
assert res.output.contains('Updating module `pcre`'), res.output
27+
assert res.output.contains('Updating module `nedpals.args`'), res.output
28+
assert res.output.contains('Updating module `vtray`'), res.output
29+
assert res.output.contains('Skipping download count increment for `nedpals.args`.'), res.output
30+
assert res.output.contains('Skipping download count increment for `pcre`.'), res.output
31+
}
32+
33+
fn test_update_idents() {
34+
mut res := os.execute_or_exit('${v} update pcre')
35+
assert res.output.contains('Updating module `pcre`'), res.output
36+
res = os.execute_or_exit('${v} update nedpals.args vtray')
37+
assert res.output.contains('Updating module `vtray`'), res.output
38+
assert res.output.contains('Updating module `nedpals.args`'), res.output
39+
// Try update not installed.
40+
res = os.execute('${v} update vsl')
41+
assert res.exit_code == 1
42+
assert res.output.contains('failed to find `vsl`'), res.output
43+
// Try update mixed.
44+
res = os.execute('${v} update pcre vsl')
45+
assert res.exit_code == 1
46+
assert res.output.contains('Updating module `pcre`'), res.output
47+
assert res.output.contains('failed to find `vsl`'), res.output
48+
}

0 commit comments

Comments
 (0)