e1d10e4c5aae

accept mainstream build profiles and project markers

time
2026-10-09 17:48 UTC · 3 days ago
machine
Junes-MacBook-Pro.local
agent
gpt-5.6-sol
session
add mainstream build languages
parent
f55debb9a051
2 files src/build/build.v+36 −3src/build/build_test.v+54 −0
src/build/build.v+36 −3
@@ -23,18 +23,31 @@2323 // hold a release forever.2424 const build_timeout = 10 * time.minute2525 26-const lang_names = 'zig, rust, go, c, node, swift, python, shell, make, gradle'26+const lang_names = 'v, zig, rust, go, c, cpp, c++, node, javascript, typescript, java, kotlin, scala, csharp, c#, cs, swift, python, ruby, php, dart, elixir, lua, r, shell, make, gradle'2727 28-// Lang picks the cross-compile variables a build gets. `gradle` sets none.28+// Lang picks the cross-compile variables a build gets. Most profiles set only29+// Koh's target names; the build command owns toolchain-specific translation.2930 pub enum Lang {3031 	unknown32+	v3133 	zig3234 	rust3335 	go3436 	c37+	cpp3538 	node39+	java40+	kotlin41+	scala42+	csharp3643 	swift3744 	python45+	ruby46+	php47+	dart48+	elixir49+	lua50+	r3851 	shell3952 	make4053 	gradle@@ -118,13 +131,25 @@118131 // refused rather than quietly guessed at.119132 fn lang_of(name string) ?Lang {120133 	return match name.to_lower() {134+		'v' { Lang.v }121135 		'zig' { Lang.zig }122136 		'rust' { Lang.rust }123137 		'go' { Lang.go }124138 		'c' { Lang.c }125-		'node' { Lang.node }139+		'cpp', 'c++' { Lang.cpp }140+		'node', 'javascript', 'typescript' { Lang.node }141+		'java' { Lang.java }142+		'kotlin' { Lang.kotlin }143+		'scala' { Lang.scala }144+		'csharp', 'c#', 'cs' { Lang.csharp }126145 		'swift' { Lang.swift }127146 		'python' { Lang.python }147+		'ruby' { Lang.ruby }148+		'php' { Lang.php }149+		'dart' { Lang.dart }150+		'elixir' { Lang.elixir }151+		'lua' { Lang.lua }152+		'r' { Lang.r }128153 		'shell' { Lang.shell }129154 		'make' { Lang.make }130155 		'gradle' { Lang.gradle }@@ -137,6 +162,7 @@137162 fn detect(root string) Lang {138163 	for probe in [139164 		Probe{'build.sh', Lang.shell},165+		Probe{'v.mod', Lang.v},140166 		Probe{'build.zig', Lang.zig},141167 		Probe{'Cargo.toml', Lang.rust},142168 		Probe{'go.mod', Lang.go},@@ -144,6 +170,13 @@144170 		Probe{'pyproject.toml', Lang.python},145171 		Probe{'setup.py', Lang.python},146172 		Probe{'package.json', Lang.node},173+		Probe{'pom.xml', Lang.java},174+		Probe{'build.sbt', Lang.scala},175+		Probe{'Gemfile', Lang.ruby},176+		Probe{'composer.json', Lang.php},177+		Probe{'pubspec.yaml', Lang.dart},178+		Probe{'mix.exs', Lang.elixir},179+		Probe{'DESCRIPTION', Lang.r},147180 		Probe{'app/build.gradle.kts', Lang.gradle},148181 		Probe{'app/build.gradle', Lang.gradle},149182 		Probe{'build.gradle.kts', Lang.gradle},

view file

src/build/build_test.v+54 −0
@@ -170,6 +170,60 @@170170 	assert read_config(root)!.lang == .shell171171 }172172 173+fn test_every_defined_build_language_and_alias_is_accepted() {174+	profiles := map[string]Lang{175+		'v':          .v176+		'zig':        .zig177+		'rust':       .rust178+		'go':         .go179+		'c':          .c180+		'cpp':        .cpp181+		'c++':        .cpp182+		'node':       .node183+		'javascript': .node184+		'typescript': .node185+		'java':       .java186+		'kotlin':     .kotlin187+		'scala':      .scala188+		'csharp':     .csharp189+		'c#':         .csharp190+		'cs':         .csharp191+		'swift':      .swift192+		'python':     .python193+		'ruby':       .ruby194+		'php':        .php195+		'dart':       .dart196+		'elixir':     .elixir197+		'lua':        .lua198+		'r':          .r199+		'shell':      .shell200+		'make':       .make201+		'gradle':     .gradle202+	}203+	for name, want in profiles {204+		assert lang_of(name)? == want, name205+	}206+}207+208+fn test_mainstream_project_markers_are_detected() {209+	markers := map[string]Lang{210+		'v.mod':         .v211+		'pom.xml':       .java212+		'build.sbt':     .scala213+		'Gemfile':       .ruby214+		'composer.json': .php215+		'pubspec.yaml':  .dart216+		'mix.exs':       .elixir217+		'DESCRIPTION':   .r218+	}219+	for file, want in markers {220+		root := scratch('detect_marker')!221+		write(root, file, '')!222+		assert detect(root) == want, file223+		os.rmdir_all(root) or {}224+	}225+}226+173227 fn test_read_config_refuses_what_it_cannot_build() {174228 	root := scratch('config_bad')!175229 	defer {

view file