v.util: extract v.util.version, use it to speed up building `v repl`, `v up` and `v doctor`
parent
cb7be87d4e
commit
6134c4870b
|
@ -6,7 +6,6 @@ import time
|
||||||
import term
|
import term
|
||||||
import math
|
import math
|
||||||
import scripting
|
import scripting
|
||||||
import v.util
|
|
||||||
|
|
||||||
struct CmdResult {
|
struct CmdResult {
|
||||||
mut:
|
mut:
|
||||||
|
@ -127,8 +126,12 @@ fn new_aints(ovals []int, extreme_mins int, extreme_maxs int) Aints {
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn bold(s string) string {
|
||||||
|
return term.colorize(term.bold, s)
|
||||||
|
}
|
||||||
|
|
||||||
fn (a Aints) str() string {
|
fn (a Aints) str() string {
|
||||||
return util.bold('${a.average:6.2f}') +
|
return bold('${a.average:6.2f}') +
|
||||||
'ms ± σ: ${a.stddev:4.1f}ms, min: ${a.imin:4}ms, max: ${a.imax:4}ms, runs:${a.values.len:3}, nmins:${a.nmins:2}, nmaxs:${a.nmaxs:2}'
|
'ms ± σ: ${a.stddev:4.1f}ms, min: ${a.imin:4}ms, max: ${a.imax:4}ms, runs:${a.values.len:3}, nmins:${a.nmins:2}, nmaxs:${a.nmaxs:2}'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -346,7 +349,7 @@ fn (mut context Context) show_diff_summary() {
|
||||||
first_marker = ' '
|
first_marker = ' '
|
||||||
cpercent := (r.atiming.average / base) * 100 - 100
|
cpercent := (r.atiming.average / base) * 100 - 100
|
||||||
if r.icmd == 0 {
|
if r.icmd == 0 {
|
||||||
first_marker = util.bold('>')
|
first_marker = bold('>')
|
||||||
first_cmd_percentage = cpercent
|
first_cmd_percentage = cpercent
|
||||||
}
|
}
|
||||||
println(' $first_marker${(i + 1):3} | ${cpercent:5.1f}% slower | ${r.cmd:-57s} | $r.atiming')
|
println(' $first_marker${(i + 1):3} | ${cpercent:5.1f}% slower | ${r.cmd:-57s} | $r.atiming')
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import os
|
import os
|
||||||
import time
|
import time
|
||||||
import v.util
|
import term
|
||||||
|
import v.util.version
|
||||||
import runtime
|
import runtime
|
||||||
|
|
||||||
struct App {
|
struct App {
|
||||||
|
@ -109,7 +110,7 @@ fn (mut a App) collect_info() {
|
||||||
a.line('vexe mtime', time.unix(os.file_last_mod_unix(vexe)).str())
|
a.line('vexe mtime', time.unix(os.file_last_mod_unix(vexe)).str())
|
||||||
a.line('is vroot writable', is_writable_dir(vroot).str())
|
a.line('is vroot writable', is_writable_dir(vroot).str())
|
||||||
a.line('is vmodules writable', is_writable_dir(vmodules).str())
|
a.line('is vmodules writable', is_writable_dir(vmodules).str())
|
||||||
a.line('V full version', util.full_v_version(true))
|
a.line('V full version', version.full_v_version(true))
|
||||||
vtmp := os.getenv('VTMP')
|
vtmp := os.getenv('VTMP')
|
||||||
if vtmp != '' {
|
if vtmp != '' {
|
||||||
a.line('env VTMP', '"$vtmp"')
|
a.line('env VTMP', '"$vtmp"')
|
||||||
|
@ -149,7 +150,7 @@ fn (mut a App) cmd(c CmdConfig) string {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (mut a App) line(label string, value string) {
|
fn (mut a App) line(label string, value string) {
|
||||||
a.println('$label: ${util.bold(value)}')
|
a.println('$label: ${term.colorize(term.bold, value)}')
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (app &App) parse(config string, sep string) map[string]string {
|
fn (app &App) parse(config string, sep string) map[string]string {
|
||||||
|
|
|
@ -8,7 +8,7 @@ import term
|
||||||
import rand
|
import rand
|
||||||
import readline
|
import readline
|
||||||
import os.cmdline
|
import os.cmdline
|
||||||
import v.util
|
import v.util.version
|
||||||
|
|
||||||
struct Repl {
|
struct Repl {
|
||||||
mut:
|
mut:
|
||||||
|
@ -102,7 +102,7 @@ fn (r &Repl) current_source_code(should_add_temp_lines bool, not_add_print bool)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn repl_help() {
|
fn repl_help() {
|
||||||
println(util.full_v_version(false))
|
println(version.full_v_version(false))
|
||||||
println('
|
println('
|
||||||
|help Displays this information.
|
|help Displays this information.
|
||||||
|list Show the program so far.
|
|list Show the program so far.
|
||||||
|
@ -114,8 +114,8 @@ fn repl_help() {
|
||||||
|
|
||||||
fn run_repl(workdir string, vrepl_prefix string) {
|
fn run_repl(workdir string, vrepl_prefix string) {
|
||||||
if !is_stdin_a_pipe {
|
if !is_stdin_a_pipe {
|
||||||
println(util.full_v_version(false))
|
println(version.full_v_version(false))
|
||||||
println('Use Ctrl-C or ${util.pretty_print('exit')} to exit, or ${util.pretty_print('help')} to see other available commands')
|
println('Use Ctrl-C or ${term.highlight_command('exit')} to exit, or ${term.highlight_command('help')} to see other available commands')
|
||||||
}
|
}
|
||||||
|
|
||||||
if vstartup != '' {
|
if vstartup != '' {
|
||||||
|
|
|
@ -2,7 +2,7 @@ module main
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import v.pref
|
import v.pref
|
||||||
import v.util
|
import v.util.version
|
||||||
import v.util.recompilation
|
import v.util.recompilation
|
||||||
|
|
||||||
struct App {
|
struct App {
|
||||||
|
@ -29,8 +29,8 @@ fn main() {
|
||||||
os.chdir(app.vroot)
|
os.chdir(app.vroot)
|
||||||
println('Updating V...')
|
println('Updating V...')
|
||||||
app.update_from_master()
|
app.update_from_master()
|
||||||
v_hash := util.githash(false)
|
v_hash := version.githash(false)
|
||||||
current_hash := util.githash(true)
|
current_hash := version.githash(true)
|
||||||
// println(v_hash)
|
// println(v_hash)
|
||||||
// println(current_hash)
|
// println(current_hash)
|
||||||
if v_hash == current_hash {
|
if v_hash == current_hash {
|
||||||
|
|
18
cmd/v/v.v
18
cmd/v/v.v
|
@ -5,8 +5,10 @@ module main
|
||||||
|
|
||||||
import help
|
import help
|
||||||
import os
|
import os
|
||||||
|
import term
|
||||||
import v.pref
|
import v.pref
|
||||||
import v.util
|
import v.util
|
||||||
|
import v.util.version
|
||||||
import v.builder
|
import v.builder
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -60,10 +62,10 @@ fn main() {
|
||||||
// Running `./v` without args launches repl
|
// Running `./v` without args launches repl
|
||||||
if args.len == 0 {
|
if args.len == 0 {
|
||||||
if os.is_atty(0) != 0 {
|
if os.is_atty(0) != 0 {
|
||||||
cmd_exit := util.pretty_print('exit')
|
cmd_exit := term.highlight_command('exit')
|
||||||
cmd_help := util.pretty_print('v help')
|
cmd_help := term.highlight_command('v help')
|
||||||
file_main := util.pretty_print('main.v')
|
file_main := term.highlight_command('main.v')
|
||||||
cmd_run := util.pretty_print('v run main.v')
|
cmd_run := term.highlight_command('v run main.v')
|
||||||
println('Welcome to the V REPL (for help with V itself, type $cmd_exit, then run $cmd_help).')
|
println('Welcome to the V REPL (for help with V itself, type $cmd_exit, then run $cmd_help).')
|
||||||
eprintln(' NB: the REPL is highly experimental. For best V experience, use a text editor,')
|
eprintln(' NB: the REPL is highly experimental. For best V experience, use a text editor,')
|
||||||
eprintln(' save your code in a $file_main file and execute: $cmd_run')
|
eprintln(' save your code in a $file_main file and execute: $cmd_run')
|
||||||
|
@ -114,7 +116,7 @@ fn main() {
|
||||||
exit(1)
|
exit(1)
|
||||||
}
|
}
|
||||||
'version' {
|
'version' {
|
||||||
println(util.full_v_version(prefs.is_verbose))
|
println(version.full_v_version(prefs.is_verbose))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
else {}
|
else {}
|
||||||
|
@ -128,7 +130,7 @@ fn main() {
|
||||||
if prefs.is_help {
|
if prefs.is_help {
|
||||||
invoke_help_and_exit(args)
|
invoke_help_and_exit(args)
|
||||||
}
|
}
|
||||||
eprintln('v $command: unknown command\nRun ${util.pretty_print('v help')} for usage.')
|
eprintln('v $command: unknown command\nRun ${term.highlight_command('v help')} for usage.')
|
||||||
exit(1)
|
exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -138,7 +140,7 @@ fn invoke_help_and_exit(remaining []string) {
|
||||||
2 { help.print_and_exit(remaining[1]) }
|
2 { help.print_and_exit(remaining[1]) }
|
||||||
else {}
|
else {}
|
||||||
}
|
}
|
||||||
println('${util.pretty_print('v help')}: provide only one help topic.')
|
println('${term.highlight_command('v help')}: provide only one help topic.')
|
||||||
println('For usage information, use ${util.pretty_print('v help')}.')
|
println('For usage information, use ${term.highlight_command('v help')}.')
|
||||||
exit(1)
|
exit(1)
|
||||||
}
|
}
|
||||||
|
|
|
@ -191,3 +191,9 @@ pub fn yellow(msg string) string {
|
||||||
pub fn bright_yellow(msg string) string {
|
pub fn bright_yellow(msg string) string {
|
||||||
return format(msg, '93', '39')
|
return format(msg, '93', '39')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// highlight_command highlights the command with an on-brand background
|
||||||
|
// to make CLI commands immediately recognizable.
|
||||||
|
pub fn highlight_command(command string) string {
|
||||||
|
return bright_white(bg_cyan(' $command '))
|
||||||
|
}
|
||||||
|
|
|
@ -10,6 +10,7 @@ import v.vmod
|
||||||
import v.token
|
import v.token
|
||||||
import v.pref
|
import v.pref
|
||||||
import v.util
|
import v.util
|
||||||
|
import v.util.version
|
||||||
import v.errors
|
import v.errors
|
||||||
import v.pkgconfig
|
import v.pkgconfig
|
||||||
import v.gen.native
|
import v.gen.native
|
||||||
|
@ -5683,7 +5684,7 @@ fn (mut c Checker) at_expr(mut node ast.AtExpr) ast.Type {
|
||||||
node.val = (node.pos.col + 1).str()
|
node.val = (node.pos.col + 1).str()
|
||||||
}
|
}
|
||||||
.vhash {
|
.vhash {
|
||||||
node.val = util.vhash()
|
node.val = version.vhash()
|
||||||
}
|
}
|
||||||
.vmod_file {
|
.vmod_file {
|
||||||
// cache the vmod content, do not read it many times
|
// cache the vmod content, do not read it many times
|
||||||
|
|
|
@ -9,6 +9,7 @@ import v.ast
|
||||||
import v.pref
|
import v.pref
|
||||||
import v.token
|
import v.token
|
||||||
import v.util
|
import v.util
|
||||||
|
import v.util.version
|
||||||
import v.depgraph
|
import v.depgraph
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -389,8 +390,8 @@ pub fn gen(files []&ast.File, table &ast.Table, pref &pref.Preferences) string {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn (g &Gen) hashes() string {
|
pub fn (g &Gen) hashes() string {
|
||||||
mut res := c_commit_hash_default.replace('@@@', util.vhash())
|
mut res := c_commit_hash_default.replace('@@@', version.vhash())
|
||||||
res += c_current_commit_hash_default.replace('@@@', util.githash(g.pref.building_v))
|
res += c_current_commit_hash_default.replace('@@@', version.githash(g.pref.building_v))
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@ import v.ast
|
||||||
import v.token
|
import v.token
|
||||||
import v.pref
|
import v.pref
|
||||||
import v.util
|
import v.util
|
||||||
|
import v.util.version
|
||||||
import v.depgraph
|
import v.depgraph
|
||||||
import encoding.base64
|
import encoding.base64
|
||||||
import v.gen.js.sourcemap
|
import v.gen.js.sourcemap
|
||||||
|
@ -329,8 +330,8 @@ pub fn (mut g JsGen) init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn (g JsGen) hashes() string {
|
pub fn (g JsGen) hashes() string {
|
||||||
mut res := '// V_COMMIT_HASH $util.vhash()\n'
|
mut res := '// V_COMMIT_HASH $version.vhash()\n'
|
||||||
res += '// V_CURRENT_COMMIT_HASH ${util.githash(g.pref.building_v)}\n'
|
res += '// V_CURRENT_COMMIT_HASH ${version.githash(g.pref.building_v)}\n'
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,14 @@
|
||||||
import os
|
import os
|
||||||
import term
|
import term
|
||||||
import benchmark
|
import benchmark
|
||||||
import v.util
|
|
||||||
import v.util.vtest
|
import v.util.vtest
|
||||||
|
|
||||||
const turn_off_vcolors = os.setenv('VCOLORS', 'never', true)
|
const turn_off_vcolors = os.setenv('VCOLORS', 'never', true)
|
||||||
|
|
||||||
|
fn bold(s string) string {
|
||||||
|
return term.colorize(term.bold, s)
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// NB: skip_compile_files can be used for totally skipping .v files temporarily.
|
// NB: skip_compile_files can be used for totally skipping .v files temporarily.
|
||||||
// .v files in skip_valgrind_files will be compiled, but will not be run under
|
// .v files in skip_valgrind_files will be compiled, but will not be run under
|
||||||
|
@ -72,7 +75,7 @@ fn test_all() {
|
||||||
exe_filename := '$wrkdir/x'
|
exe_filename := '$wrkdir/x'
|
||||||
full_path_to_source_file := os.join_path(vroot, test)
|
full_path_to_source_file := os.join_path(vroot, test)
|
||||||
compile_cmd := '$vexe -o $exe_filename -cg -cflags "-w" -autofree "$full_path_to_source_file"'
|
compile_cmd := '$vexe -o $exe_filename -cg -cflags "-w" -autofree "$full_path_to_source_file"'
|
||||||
vprintln('compile cmd: ${util.bold(compile_cmd)}')
|
vprintln('compile cmd: ${bold(compile_cmd)}')
|
||||||
res := os.execute(compile_cmd)
|
res := os.execute(compile_cmd)
|
||||||
if res.exit_code != 0 {
|
if res.exit_code != 0 {
|
||||||
bench.fail()
|
bench.fail()
|
||||||
|
@ -89,11 +92,11 @@ fn test_all() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
valgrind_cmd := 'valgrind --error-exitcode=1 --leak-check=full $exe_filename'
|
valgrind_cmd := 'valgrind --error-exitcode=1 --leak-check=full $exe_filename'
|
||||||
vprintln('valgrind cmd: ${util.bold(valgrind_cmd)}')
|
vprintln('valgrind cmd: ${bold(valgrind_cmd)}')
|
||||||
valgrind_res := os.execute(valgrind_cmd)
|
valgrind_res := os.execute(valgrind_cmd)
|
||||||
if valgrind_res.exit_code != 0 {
|
if valgrind_res.exit_code != 0 {
|
||||||
bench.fail()
|
bench.fail()
|
||||||
eprintln(bench.step_message_fail('failed valgrind check for ${util.bold(test)}'))
|
eprintln(bench.step_message_fail('failed valgrind check for ${bold(test)}'))
|
||||||
eprintln(valgrind_res.output)
|
eprintln(valgrind_res.output)
|
||||||
eprintln('You can reproduce the failure with:\n$compile_cmd && $valgrind_cmd')
|
eprintln('You can reproduce the failure with:\n$compile_cmd && $valgrind_cmd')
|
||||||
continue
|
continue
|
||||||
|
|
|
@ -5,15 +5,10 @@ module util
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import time
|
import time
|
||||||
import term
|
|
||||||
import v.pref
|
import v.pref
|
||||||
import v.vmod
|
import v.vmod
|
||||||
import v.util.recompilation
|
import v.util.recompilation
|
||||||
|
|
||||||
pub const (
|
|
||||||
v_version = '0.2.2'
|
|
||||||
)
|
|
||||||
|
|
||||||
// math.bits is needed by strconv.ftoa
|
// math.bits is needed by strconv.ftoa
|
||||||
pub const (
|
pub const (
|
||||||
builtin_module_parts = ['math.bits', 'strconv', 'strconv.ftoa', 'strings', 'builtin']
|
builtin_module_parts = ['math.bits', 'strconv', 'strconv.ftoa', 'strings', 'builtin']
|
||||||
|
@ -45,86 +40,6 @@ pub fn tabs(n int) string {
|
||||||
return if n < util.const_tabs.len { util.const_tabs[n] } else { '\t'.repeat(n) }
|
return if n < util.const_tabs.len { util.const_tabs[n] } else { '\t'.repeat(n) }
|
||||||
}
|
}
|
||||||
|
|
||||||
// vhash() returns the build string C.V_COMMIT_HASH . See cmd/tools/gen_vc.v .
|
|
||||||
pub fn vhash() string {
|
|
||||||
mut buf := [50]byte{}
|
|
||||||
buf[0] = 0
|
|
||||||
unsafe {
|
|
||||||
bp := &buf[0]
|
|
||||||
C.snprintf(&char(bp), 50, c'%s', C.V_COMMIT_HASH)
|
|
||||||
return tos_clone(bp)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn full_hash() string {
|
|
||||||
build_hash := vhash()
|
|
||||||
current_hash := githash(false)
|
|
||||||
if build_hash == current_hash {
|
|
||||||
return build_hash
|
|
||||||
}
|
|
||||||
return '${build_hash}.$current_hash'
|
|
||||||
}
|
|
||||||
|
|
||||||
// full_v_version() returns the full version of the V compiler
|
|
||||||
pub fn full_v_version(is_verbose bool) string {
|
|
||||||
if is_verbose {
|
|
||||||
return 'V $util.v_version $full_hash()'
|
|
||||||
}
|
|
||||||
hash := githash(false)
|
|
||||||
return 'V $util.v_version $hash'
|
|
||||||
}
|
|
||||||
|
|
||||||
// githash(x) returns the current git commit hash.
|
|
||||||
// When x is false, it is very fast - it just returns a predefined C constant.
|
|
||||||
// When x is true, it tries to get the current commit hash, by parsing the
|
|
||||||
// relevant files in the .git/ folder, or if that is not possible
|
|
||||||
// for example when using a V from a V binary release, that does not have .git/
|
|
||||||
// defaults to getting the predefined C constant again.
|
|
||||||
// NB: githash(true) must be called only when v detects that it builds itself.
|
|
||||||
// For all other programs, githash(false) should be used.
|
|
||||||
pub fn githash(should_get_from_filesystem bool) string {
|
|
||||||
for {
|
|
||||||
// The `for` construct here is used as a goto substitute.
|
|
||||||
// The code in this function will break out of the `for`
|
|
||||||
// if it detects an error and can not continue.
|
|
||||||
if should_get_from_filesystem {
|
|
||||||
vexe := os.getenv('VEXE')
|
|
||||||
vroot := os.dir(vexe)
|
|
||||||
// .git/HEAD
|
|
||||||
git_head_file := os.join_path(vroot, '.git', 'HEAD')
|
|
||||||
if !os.exists(git_head_file) {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
// 'ref: refs/heads/master' ... the current branch name
|
|
||||||
head_content := os.read_file(git_head_file) or { break }
|
|
||||||
mut current_branch_hash := head_content
|
|
||||||
if head_content.starts_with('ref: ') {
|
|
||||||
gcbranch_rel_path := head_content.replace('ref: ', '').trim_space()
|
|
||||||
gcbranch_file := os.join_path(vroot, '.git', gcbranch_rel_path)
|
|
||||||
// .git/refs/heads/master
|
|
||||||
if !os.exists(gcbranch_file) {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
// get the full commit hash contained in the ref heads file
|
|
||||||
branch_hash := os.read_file(gcbranch_file) or { break }
|
|
||||||
current_branch_hash = branch_hash
|
|
||||||
}
|
|
||||||
desired_hash_length := 7
|
|
||||||
if current_branch_hash.len > desired_hash_length {
|
|
||||||
return current_branch_hash[0..desired_hash_length]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break
|
|
||||||
}
|
|
||||||
mut buf := [50]byte{}
|
|
||||||
buf[0] = 0
|
|
||||||
unsafe {
|
|
||||||
bp := &buf[0]
|
|
||||||
C.snprintf(&char(bp), 50, c'%s', C.V_CURRENT_COMMIT_HASH)
|
|
||||||
return tos_clone(bp)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
pub fn set_vroot_folder(vroot_path string) {
|
pub fn set_vroot_folder(vroot_path string) {
|
||||||
// Preparation for the compiler module:
|
// Preparation for the compiler module:
|
||||||
|
@ -235,7 +150,7 @@ pub fn launch_tool(is_verbose bool, tool_name string, args []string) {
|
||||||
for emodule in emodules {
|
for emodule in emodules {
|
||||||
check_module_is_installed(emodule, is_verbose) or { panic(err) }
|
check_module_is_installed(emodule, is_verbose) or { panic(err) }
|
||||||
}
|
}
|
||||||
mut compilation_command := '"$vexe" '
|
mut compilation_command := '"$vexe" -skip-unused '
|
||||||
if tool_name in ['vself', 'vup', 'vdoctor', 'vsymlink'] {
|
if tool_name in ['vself', 'vup', 'vdoctor', 'vsymlink'] {
|
||||||
// These tools will be called by users in cases where there
|
// These tools will be called by users in cases where there
|
||||||
// is high chance of there being a problem somewhere. Thus
|
// is high chance of there being a problem somewhere. Thus
|
||||||
|
@ -570,9 +485,3 @@ pub fn find_all_v_files(roots []string) ?[]string {
|
||||||
}
|
}
|
||||||
return files
|
return files
|
||||||
}
|
}
|
||||||
|
|
||||||
// Highlight a command with an on-brand background to make CLI
|
|
||||||
// commands immediately recognizable.
|
|
||||||
pub fn pretty_print(command string) string {
|
|
||||||
return term.bright_white(term.bg_cyan(' $command '))
|
|
||||||
}
|
|
||||||
|
|
|
@ -0,0 +1,85 @@
|
||||||
|
module version
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
pub const v_version = '0.2.2'
|
||||||
|
|
||||||
|
// vhash() returns the build string C.V_COMMIT_HASH . See cmd/tools/gen_vc.v .
|
||||||
|
pub fn vhash() string {
|
||||||
|
mut buf := [50]byte{}
|
||||||
|
buf[0] = 0
|
||||||
|
unsafe {
|
||||||
|
bp := &buf[0]
|
||||||
|
C.snprintf(&char(bp), 50, c'%s', C.V_COMMIT_HASH)
|
||||||
|
return tos_clone(bp)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn full_hash() string {
|
||||||
|
build_hash := vhash()
|
||||||
|
current_hash := githash(false)
|
||||||
|
if build_hash == current_hash {
|
||||||
|
return build_hash
|
||||||
|
}
|
||||||
|
return '${build_hash}.$current_hash'
|
||||||
|
}
|
||||||
|
|
||||||
|
// full_v_version() returns the full version of the V compiler
|
||||||
|
pub fn full_v_version(is_verbose bool) string {
|
||||||
|
if is_verbose {
|
||||||
|
return 'V $version.v_version $full_hash()'
|
||||||
|
}
|
||||||
|
hash := githash(false)
|
||||||
|
return 'V $version.v_version $hash'
|
||||||
|
}
|
||||||
|
|
||||||
|
// githash(x) returns the current git commit hash.
|
||||||
|
// When x is false, it is very fast - it just returns a predefined C constant.
|
||||||
|
// When x is true, it tries to get the current commit hash, by parsing the
|
||||||
|
// relevant files in the .git/ folder, or if that is not possible
|
||||||
|
// for example when using a V from a V binary release, that does not have .git/
|
||||||
|
// defaults to getting the predefined C constant again.
|
||||||
|
// NB: githash(true) must be called only when v detects that it builds itself.
|
||||||
|
// For all other programs, githash(false) should be used.
|
||||||
|
pub fn githash(should_get_from_filesystem bool) string {
|
||||||
|
for {
|
||||||
|
// The `for` construct here is used as a goto substitute.
|
||||||
|
// The code in this function will break out of the `for`
|
||||||
|
// if it detects an error and can not continue.
|
||||||
|
if should_get_from_filesystem {
|
||||||
|
vexe := os.getenv('VEXE')
|
||||||
|
vroot := os.dir(vexe)
|
||||||
|
// .git/HEAD
|
||||||
|
git_head_file := os.join_path(vroot, '.git', 'HEAD')
|
||||||
|
if !os.exists(git_head_file) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
// 'ref: refs/heads/master' ... the current branch name
|
||||||
|
head_content := os.read_file(git_head_file) or { break }
|
||||||
|
mut current_branch_hash := head_content
|
||||||
|
if head_content.starts_with('ref: ') {
|
||||||
|
gcbranch_rel_path := head_content.replace('ref: ', '').trim_space()
|
||||||
|
gcbranch_file := os.join_path(vroot, '.git', gcbranch_rel_path)
|
||||||
|
// .git/refs/heads/master
|
||||||
|
if !os.exists(gcbranch_file) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
// get the full commit hash contained in the ref heads file
|
||||||
|
branch_hash := os.read_file(gcbranch_file) or { break }
|
||||||
|
current_branch_hash = branch_hash
|
||||||
|
}
|
||||||
|
desired_hash_length := 7
|
||||||
|
if current_branch_hash.len > desired_hash_length {
|
||||||
|
return current_branch_hash[0..desired_hash_length]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
mut buf := [50]byte{}
|
||||||
|
buf[0] = 0
|
||||||
|
unsafe {
|
||||||
|
bp := &buf[0]
|
||||||
|
C.snprintf(&char(bp), 50, c'%s', C.V_CURRENT_COMMIT_HASH)
|
||||||
|
return tos_clone(bp)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue