vgit: avoid generics; enables compilation of the performance_compare & oldv tools.

pull/4529/head
Delyan Angelov 2020-04-20 18:39:25 +03:00
parent dc8199709f
commit 7a03b18bfe
3 changed files with 34 additions and 34 deletions

View File

@ -133,7 +133,16 @@ pub fn (vgit_context mut VGitContext) compile_oldv_if_needed() {
// which should be a valid working V executable. // which should be a valid working V executable.
} }
pub fn add_common_tool_options<T>(context mut T, fp mut flag.FlagParser) []string { pub struct VGitOptions {
mut:
workdir string // the working folder (typically /tmp), where the tool will write
v_repo_url string // the url of the V repository. It can be a local folder path, if you want to eliminate network operations...
vc_repo_url string // the url of the vc repository. It can be a local folder path, if you want to eliminate network operations...
show_help bool // whether to show the usage screen
verbose bool // should the tool be much more verbose
}
pub fn add_common_tool_options(context mut VGitOptions, fp mut flag.FlagParser) []string {
tdir := os.temp_dir() tdir := os.temp_dir()
context.workdir = os.real_path(fp.string('workdir', `w`, tdir, 'A writable base folder. Default: $tdir')) context.workdir = os.real_path(fp.string('workdir', `w`, tdir, 'A writable base folder. Default: $tdir'))
context.v_repo_url = fp.string('vrepo', 0, vgit.remote_v_repo_url, 'The url of the V repository. You can clone it locally too. See also --vcrepo below.') context.v_repo_url = fp.string('vrepo', 0, vgit.remote_v_repo_url, 'The url of the V repository. You can clone it locally too. See also --vcrepo below.')

View File

@ -31,9 +31,7 @@ const (
struct Context { struct Context {
mut: mut:
v_repo_url string // the url of the V repository. It can be a local folder path, if you want to eliminate network operations... vgo vgit.VGitOptions
vc_repo_url string // the url of the vc repository. It can be a local folder path, if you want to eliminate network operations...
workdir string // the working folder (typically /tmp), where the tool will write
commit_v string='master' // the commit from which you want to produce a working v compiler (this may be a commit-ish too) commit_v string='master' // the commit from which you want to produce a working v compiler (this may be a commit-ish too)
commit_vc string='master' // this will be derived from commit_v commit_vc string='master' // this will be derived from commit_v
commit_v_hash string // this will be filled from the commit-ish commit_v using rev-list. It IS a commit hash. commit_v_hash string // this will be filled from the commit-ish commit_v using rev-list. It IS a commit hash.
@ -42,19 +40,17 @@ mut:
cmd_to_run string // the command that you want to run *in* the oldv repo cmd_to_run string // the command that you want to run *in* the oldv repo
cc string='cc' // the C compiler to use for bootstrapping. cc string='cc' // the C compiler to use for bootstrapping.
cleanup bool // should the tool run a cleanup first cleanup bool // should the tool run a cleanup first
verbose bool // should the tool be much more verbose
show_help bool // whether to show the usage screen
} }
fn (c mut Context) compile_oldv_if_needed() { fn (c mut Context) compile_oldv_if_needed() {
mut vgit_context := vgit.VGitContext{ mut vgit_context := vgit.VGitContext{
workdir: c.vgo.workdir
v_repo_url: c.vgo.v_repo_url
vc_repo_url: c.vgo.vc_repo_url
cc: c.cc cc: c.cc
workdir: c.workdir
commit_v: c.commit_v commit_v: c.commit_v
path_v: c.path_v path_v: c.path_v
path_vc: c.path_vc path_vc: c.path_vc
v_repo_url: c.v_repo_url
vc_repo_url: c.vc_repo_url
} }
vgit_context.compile_oldv_if_needed() vgit_context.compile_oldv_if_needed()
c.commit_v_hash = vgit_context.commit_v__hash c.commit_v_hash = vgit_context.commit_v__hash
@ -79,18 +75,17 @@ fn main() {
context.cleanup = fp.bool('clean', 0, true, 'Clean before running (slower).') context.cleanup = fp.bool('clean', 0, true, 'Clean before running (slower).')
context.cmd_to_run = fp.string('command', `c`, '', 'Command to run in the old V repo.\n') context.cmd_to_run = fp.string('command', `c`, '', 'Command to run in the old V repo.\n')
commits := vgit.add_common_tool_options(mut context, mut fp) commits := vgit.add_common_tool_options(mut context.vgo, mut fp)
if commits.len > 0 { if commits.len > 0 {
context.commit_v = commits[0] context.commit_v = commits[0]
} else { } else {
context.commit_v = scripting.run('git rev-list -n1 HEAD') context.commit_v = scripting.run('git rev-list -n1 HEAD')
} }
println('################# context.commit_v: $context.commit_v #####################') println('################# context.commit_v: $context.commit_v #####################')
context.path_v = vgit.normalized_workpath_for_commit(context.workdir, context.commit_v) context.path_v = vgit.normalized_workpath_for_commit(context.vgo.workdir, context.commit_v)
context.path_vc = vgit.normalized_workpath_for_commit(context.workdir, 'vc') context.path_vc = vgit.normalized_workpath_for_commit(context.vgo.workdir, 'vc')
if !os.is_dir(context.workdir) { if !os.is_dir(context.vgo.workdir) {
msg := 'Work folder: ' + context.workdir + ' , does not exist.' eprintln('Work folder: ${context.vgo.workdir} , does not exist.')
eprintln(msg)
exit(2) exit(2)
} }
ecc := os.getenv('CC') ecc := os.getenv('CC')

View File

@ -16,17 +16,13 @@ const (
struct Context { struct Context {
cwd string // current working folder cwd string // current working folder
mut: mut:
v_repo_url string // the url of the vc repository. It can be a local folder path, which is useful to eliminate network operations... vgo vgit.VGitOptions
vc_repo_url string // the url of the vc repository. It can be a local folder path, which is useful to eliminate network operations...
workdir string // the working folder (typically /tmp), where the tool will write
a string // the full path to the 'after' folder inside workdir a string // the full path to the 'after' folder inside workdir
b string // the full path to the 'before' folder inside workdir b string // the full path to the 'before' folder inside workdir
vc string // the full path to the vc folder inside workdir. It is used during bootstrapping v from the C source. vc string // the full path to the vc folder inside workdir. It is used during bootstrapping v from the C source.
commit_before string // the git commit for the 'before' state commit_before string // the git commit for the 'before' state
commit_after string // the git commit for the 'after' state commit_after string // the git commit for the 'after' state
warmups int // how many times to execute a command before gathering stats warmups int // how many times to execute a command before gathering stats
verbose bool // whether to print even more stuff
show_help bool // whether to show the usage screen
hyperfineopts string // use for additional CLI options that will be given to the hyperfine command hyperfineopts string // use for additional CLI options that will be given to the hyperfine command
vflags string // other v options to pass to compared v commands vflags string // other v options to pass to compared v commands
} }
@ -42,14 +38,14 @@ fn new_context() Context {
fn (c Context) compare_versions() { fn (c Context) compare_versions() {
// Input is validated at this point... // Input is validated at this point...
// Cleanup artifacts from previous runs of this tool: // Cleanup artifacts from previous runs of this tool:
scripting.chdir(c.workdir) scripting.chdir(c.vgo.workdir)
scripting.run('rm -rf "$c.a" "$c.b" "$c.vc" ') scripting.run('rm -rf "$c.a" "$c.b" "$c.vc" ')
// clone the VC source *just once per comparison*, and reuse it: // clone the VC source *just once per comparison*, and reuse it:
scripting.run('git clone --quiet "$c.vc_repo_url" "$c.vc" ') scripting.run('git clone --quiet "$c.vgo.vc_repo_url" "$c.vc" ')
println('Comparing V performance of commit $c.commit_before (before) vs commit $c.commit_after (after) ...') println('Comparing V performance of commit $c.commit_before (before) vs commit $c.commit_after (after) ...')
c.prepare_v(c.b, c.commit_before) c.prepare_v(c.b, c.commit_before)
c.prepare_v(c.a, c.commit_after) c.prepare_v(c.a, c.commit_after)
scripting.chdir(c.workdir) scripting.chdir(c.vgo.workdir)
if c.vflags.len > 0 { if c.vflags.len > 0 {
os.setenv('VFLAGS', c.vflags, true) os.setenv('VFLAGS', c.vflags, true)
@ -95,12 +91,12 @@ fn (c &Context) prepare_v(cdir string, commit string) {
} }
mut vgit_context := vgit.VGitContext{ mut vgit_context := vgit.VGitContext{
cc: cc cc: cc
workdir: c.workdir
commit_v: commit commit_v: commit
path_v: cdir path_v: cdir
path_vc: c.vc path_vc: c.vc
v_repo_url: c.v_repo_url workdir: c.vgo.workdir
vc_repo_url: c.vc_repo_url v_repo_url: c.vgo.v_repo_url
vc_repo_url: c.vgo.vc_repo_url
} }
vgit_context.compile_oldv_if_needed() vgit_context.compile_oldv_if_needed()
scripting.chdir(cdir) scripting.chdir(cdir)
@ -164,10 +160,10 @@ fn (c Context) compare_v_performance(label string, commands []string) string {
hyperfine_commands_arguments << " \'cd ${c.a:-34s} ; ./$cmd \' ".replace_each(['@COMPILER@', source_location_a, '@DEBUG@', debug_option_a]) hyperfine_commands_arguments << " \'cd ${c.a:-34s} ; ./$cmd \' ".replace_each(['@COMPILER@', source_location_a, '@DEBUG@', debug_option_a])
} }
// ///////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////////
cmd_stats_file := os.real_path([c.workdir, 'v_performance_stats_${label}.json'].join(os.path_separator)) cmd_stats_file := os.real_path([c.vgo.workdir, 'v_performance_stats_${label}.json'].join(os.path_separator))
comparison_cmd := 'hyperfine $c.hyperfineopts ' + '--export-json ${cmd_stats_file} ' + '--time-unit millisecond ' + '--style full --warmup $c.warmups ' + hyperfine_commands_arguments.join(' ') comparison_cmd := 'hyperfine $c.hyperfineopts ' + '--export-json ${cmd_stats_file} ' + '--time-unit millisecond ' + '--style full --warmup $c.warmups ' + hyperfine_commands_arguments.join(' ')
// ///////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////////
if c.verbose { if c.vgo.verbose {
println(comparison_cmd) println(comparison_cmd)
} }
os.system(comparison_cmd) os.system(comparison_cmd)
@ -193,16 +189,16 @@ fn main() {
${flag.space}For example on linux, you may want to pass: ${flag.space}For example on linux, you may want to pass:
${flag.space}--hyperfine_options "--prepare \'sync; echo 3 | sudo tee /proc/sys/vm/drop_caches\'" ${flag.space}--hyperfine_options "--prepare \'sync; echo 3 | sudo tee /proc/sys/vm/drop_caches\'"
') ')
commits := vgit.add_common_tool_options(mut context, mut fp) commits := vgit.add_common_tool_options(mut context.vgo, mut fp)
context.commit_before = commits[0] context.commit_before = commits[0]
if commits.len > 1 { if commits.len > 1 {
context.commit_after = commits[1] context.commit_after = commits[1]
} }
context.b = vgit.normalized_workpath_for_commit(context.workdir, context.commit_before) context.b = vgit.normalized_workpath_for_commit(context.vgo.workdir, context.commit_before)
context.a = vgit.normalized_workpath_for_commit(context.workdir, context.commit_after) context.a = vgit.normalized_workpath_for_commit(context.vgo.workdir, context.commit_after)
context.vc = vgit.normalized_workpath_for_commit(context.workdir, 'vc') context.vc = vgit.normalized_workpath_for_commit(context.vgo.workdir, 'vc')
if !os.is_dir(context.workdir) { if !os.is_dir(context.vgo.workdir) {
msg := 'Work folder: ' + context.workdir + ' , does not exist.' msg := 'Work folder: ' + context.vgo.workdir + ' , does not exist.'
eprintln(msg) eprintln(msg)
exit(2) exit(2)
} }