tools: improve error diagnostic for `v up` and `v self`. Make `v self` more robust.

pull/8386/head
Delyan Angelov 2021-01-27 23:58:13 +02:00
parent 8162396783
commit 242d7d0fc0
No known key found for this signature in database
GPG Key ID: 66886C0F12D595ED
3 changed files with 31 additions and 24 deletions

View File

@ -40,13 +40,18 @@ fn compile(vroot string, cmd string) {
}
}
fn backup_old_version_and_rename_newer() ? {
fn backup_old_version_and_rename_newer() ?bool {
mut errors := []string{}
v_file := if os.user_os() == 'windows' { 'v.exe' } else { 'v' }
v2_file := if os.user_os() == 'windows' { 'v2.exe' } else { 'v2' }
bak_file := if os.user_os() == 'windows' { 'v_old.exe' } else { 'v_old' }
if os.exists(bak_file) {
os.rm(bak_file) ?
os.rm(bak_file) or { errors << 'failed removing $bak_file: $err' }
}
os.mv(v_file, bak_file) ?
os.mv(v2_file, v_file) ?
os.mv(v_file, bak_file) or { errors << err }
os.mv(v2_file, v_file) or { errors << err }
if errors.len > 0 {
return error('backup errors:\n >> ' + errors.join('\n >> '))
}
return true
}

View File

@ -43,10 +43,14 @@ fn main() {
app.show_current_v_version()
}
fn (app App) update_from_master() {
fn (app App) vprintln(s string) {
if app.is_verbose {
println('> updating from master ...')
println(s)
}
}
fn (app App) update_from_master() {
app.vprintln('> updating from master ...')
if !os.exists('.git') {
// initialize as if it had been cloned
app.git_command('init')
@ -63,16 +67,14 @@ fn (app App) update_from_master() {
fn (app App) recompile_v() {
// NB: app.vexe is more reliable than just v (which may be a symlink)
vself := '"$app.vexe" self'
if app.is_verbose {
println('> recompiling v itself with `$vself` ...')
}
app.vprintln('> recompiling v itself with `$vself` ...')
if self_result := os.exec(vself) {
if self_result.exit_code == 0 {
println(self_result.output.trim_space())
return
} else if app.is_verbose {
println('`$vself` failed, running `make`...')
println(self_result.output.trim_space())
} else {
app.vprintln('`$vself` failed, running `make`...')
app.vprintln(self_result.output.trim_space())
}
}
app.make(vself)
@ -84,9 +86,7 @@ fn (app App) make(vself string) {
make = 'make.bat'
}
make_result := os.exec(make) or { panic(err) }
if app.is_verbose {
println(make_result.output)
}
app.vprintln(make_result.output)
}
fn (app App) show_current_v_version() {
@ -114,17 +114,11 @@ fn (app App) backup(file string) {
}
fn (app App) git_command(command string) {
app.vprintln('git_command: git $command')
git_result := os.exec('git $command') or { panic(err) }
if git_result.exit_code != 0 {
if git_result.output.contains('Permission denied') {
eprintln('No access to `$app.vroot`: Permission denied')
} else {
eprintln(git_result.output)
}
exit(1)
} else {
if app.is_verbose {
println(git_result.output)
}
}
app.vprintln(git_result.output)
}

View File

@ -168,6 +168,14 @@ pub fn launch_tool(is_verbose bool, tool_name string, args []string) {
check_module_is_installed(emodule, is_verbose) or { panic(err) }
}
mut compilation_command := '"$vexe" '
if tool_name in ['vself', 'vup', 'vdoctor', 'vsymlink'] {
// These tools will be called by users in cases where there
// is high chance of there being a problem somewhere. Thus
// it is better to always compile them with -g, so that in
// case these tools do crash/panic, their backtraces will have
// .v line numbers, to ease diagnostic in #bugs and issues.
compilation_command += ' -g '
}
compilation_command += '"$tool_source"'
if is_verbose {
println('Compiling $tool_name with: "$compilation_command"')