Skip to content

fix(cli): un binario instalado con @latest decía ser "dev" - #305

Open
mmonterroca wants to merge 2 commits into
mainfrom
fix/version-from-buildinfo
Open

fix(cli): un binario instalado con @latest decía ser "dev"#305
mmonterroca wants to merge 2 commits into
mainfrom
fix/version-from-buildinfo

Conversation

@mmonterroca

Copy link
Copy Markdown
Contributor
$ go install go.ziradocs.com/slidelang/v2/cmd/slidelang@latest
$ go version -m $(which slidelang) | grep '^\s*mod'
	mod	go.ziradocs.com/slidelang/v2	v2.32.4
$ slidelang --version
slidelang version dev

El binario es de un release. La versión se estampa con -ldflags "-X main.version=…", que es un paso de goreleaser, y go install no lo hace.

Importa porque go install …@latest es lo que la documentación le dice a la gente que use — la nota de versión de installation.md lo pone al mismo nivel que Homebrew y la página de Releases. Así que "dev" era la respuesta que recibía la mayoría, y es la respuesta que vuelve inatribuible un reporte de bug.

El arreglo

resolveVersion() cae a debug.ReadBuildInfo().Main.Version solo cuando el valor estampado sigue siendo "dev".

Un go build local sigue diciendo "dev": ahí ReadBuildInfo devuelve "(devel)", que no aporta nada sobre el fallback y se lee peor. Los dos tests fijan justamente eso — que un valor estampado gana siempre, y que "(devel)" nunca llega a la salida.

Dos copias, una por módulo, en vez de un símbolo nuevo en core: son ocho líneas de stdlib sin semántica compartida que pueda derivar, y meterlo en core ataría este arreglo al bump de core. Cada módulo trae su test.

Verificación

con ldflags                          → slidelang version v2.32.5
sin ldflags, sin versión de módulo   → slidelang version dev

Ningún camino devuelve "(devel)". Ningún test del repo afirmaba sobre la salida de --version, así que no hay golden que regenerar.

La prueba que falta por construcción es la de un binario instalado desde el proxy en un tag: eso solo se puede medir después de cortar v2.32.5, y va como verificación posterior al release.

`go install go.ziradocs.com/slidelang/v2/cmd/slidelang@latest` produce un
binario de un release —`go version -m` lee v2.32.4 adentro— pero `--version`
respondía "dev", porque la versión se estampa con ldflags y eso es un paso de
goreleaser que `go install` no hace.

Y `go install @latest` es lo que la documentación le dice a la gente que use,
así que "dev" era la respuesta que recibía la mayoría; es también la respuesta
que vuelve inatribuible un reporte de bug.

`resolveVersion` cae a `debug.ReadBuildInfo().Main.Version` solo cuando el
valor estampado sigue siendo "dev". Un `go build` local sigue diciendo "dev":
ahí ReadBuildInfo devuelve "(devel)", que no aporta nada sobre el fallback y se
lee peor.

Dos copias, una por módulo, en vez de un símbolo nuevo en core: son ocho líneas
de stdlib sin semántica compartida que pueda derivar, y meterlo en core ataría
este arreglo al bump. Cada módulo trae su test.

Verificado: con ldflags, `v2.32.5`; sin ldflags y sin versión de módulo, "dev";
y ningún camino devuelve "(devel)".
Mutar el fallback para que descartara siempre `info.Main.Version` dejaba los
cuatro tests en verde, así que una regresión que volviera a mostrar "dev" en
una instalación con `@latest` no se habría detectado.

La causa es que llamaban a `resolveVersion()` desde adentro de `go test`, donde
`ReadBuildInfo` describe al binario de PRUEBA: el resultado dependía del
harness, no del arreglo.

La decisión se extrae a `pickVersion(stamped, fromBuildInfo)`, pura, y la tabla
cubre los seis casos: instalado con @latest, `go build` local que da "(devel)",
sin build info, estampado por goreleaser, estampado ganándole a la build info, y
pseudo-versión —que se acepta a propósito: es fea pero identifica el commit, que
es más de lo que dice "dev".

`resolveVersion` queda como el cableado, con un test que solo afirma lo que se
puede afirmar sin depender del entorno: que nunca deja escapar "(devel)" ni
vacío.

Con el fallback mutado, caen dos subtests de la tabla.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant