Compare commits

...
2 Commits
Author SHA1 Message Date
rmancinasandClaude Opus 5 121952fdc1 chore(release): v1.0.1
Build and Push Images / Build jorgecuadros-web (push) Successful in 2m22s
Build and Push Images / Build jorgecuadros-api (push) Successful in 2m6s
v1.0.0's images were built from db2bd54, which predates the full-hash
footer. Deploying 1.0.0 would ship the abbreviated footer, so the version
that actually goes to galactus is 1.0.1.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-30 16:38:06 -07:00
rmancinasandClaude Opus 5 15f533b984 fix(web): show the full commit hash in the build footer
The footer abbreviated to 7 characters, so the line read
"v master · 19f0319". That line exists to be pasted into `git show` or
compared against a registry tag, and an abbreviation makes both a manual
step — while the full 40-char value was already baked into the image
(build.yml passes `github.sha` whole, and /version returns it untouched).

`shortSha` had no other caller, so it goes with it.

The span gets `overflow-wrap: anywhere` and `min-width: 0`: hex offers no
break opportunity, and the api/web mismatch branch renders two of these
hashes side by side, which would otherwise push a phone into horizontal
scroll. Measured at a simulated 360px with both hashes present — the span
wraps, and documentElement.scrollWidth stays equal to clientWidth.

Verified in the browser against the dev database: footer renders
"v1.0.0 · db2bd54c0ffee1234567890abcdef0123456789a", hash length 40.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-30 16:37:48 -07:00
7 changed files with 17 additions and 13 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@jorgecuadros/api", "name": "@jorgecuadros/api",
"version": "1.0.0", "version": "1.0.1",
"private": true, "private": true,
"scripts": { "scripts": {
"build": "nest build", "build": "nest build",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@jorgecuadros/web", "name": "@jorgecuadros/web",
"version": "1.0.0", "version": "1.0.1",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "next dev -p 4500", "dev": "next dev -p 4500",
+5
View File
@@ -180,6 +180,11 @@ button {
font-family: var(--font-mono); font-family: var(--font-mono);
font-variant-numeric: tabular-nums; font-variant-numeric: tabular-nums;
cursor: help; cursor: help;
/* Full 40-char commit hashes, and two of them when the tiers disagree. Hex
offers no break opportunity, so without this the line pushes the page into
horizontal scroll on a phone. */
min-width: 0;
overflow-wrap: anywhere;
} }
.shell-footer-warn { .shell-footer-warn {
color: var(--negative); color: var(--negative);
+8 -4
View File
@@ -4,7 +4,7 @@ import { useEffect, useRef, useState, type ReactNode } from "react";
import { usePathname, useRouter } from "next/navigation"; import { usePathname, useRouter } from "next/navigation";
import Link from "next/link"; import Link from "next/link";
import { getApiVersion, logout, me, updateUiScale, type ServiceVersion } from "@/lib/api"; import { getApiVersion, logout, me, updateUiScale, type ServiceVersion } from "@/lib/api";
import { shortSha, webBuildInfo } from "@/lib/build-info"; import { webBuildInfo } from "@/lib/build-info";
import { AuthContext, can } from "@/lib/abilities"; import { AuthContext, can } from "@/lib/abilities";
import { ROLE_LABEL } from "@/lib/labels"; import { ROLE_LABEL } from "@/lib/labels";
import { import {
@@ -217,12 +217,16 @@ function BuildFooter() {
return ( return (
<footer className="shell-footer"> <footer className="shell-footer">
<span>Jorge Cuadros &amp; Asociados</span> <span>Jorge Cuadros &amp; Asociados</span>
{/* The FULL 40-char commit, not an abbreviation: this line exists to be
pasted into `git show` or compared against a registry tag, and a
7-char prefix makes both a manual step. It is what GIT_SHA already
carries — build.yml bakes in `github.sha` whole. */}
<span <span
className="shell-footer-build" className="shell-footer-build"
title={`web ${web.version} (${shortSha(web.gitSha)}) — ${web.buildDate}`} title={`web ${web.version} (${web.gitSha}) — ${web.buildDate}`}
> >
v{web.version} · {shortSha(web.gitSha)} v{web.version} · {web.gitSha}
{mismatch && api ? ` · API ${shortSha(api.gitSha)}` : ""} {mismatch && api ? ` · API ${api.gitSha}` : ""}
</span> </span>
{mismatch && ( {mismatch && (
<span className="shell-footer-warn" role="status"> <span className="shell-footer-warn" role="status">
-5
View File
@@ -35,8 +35,3 @@ export function webBuildInfo(): BuildInfo {
const injected = (window as { __APP_BUILD__?: BuildInfo }).__APP_BUILD__; const injected = (window as { __APP_BUILD__?: BuildInfo }).__APP_BUILD__;
return injected ?? UNKNOWN_BUILD; return injected ?? UNKNOWN_BUILD;
} }
/** First 7 chars, the length git itself abbreviates to. */
export function shortSha(sha: string): string {
return sha === "unknown" ? sha : sha.slice(0, 7);
}
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "jorgecuadros-platform", "name": "jorgecuadros-platform",
"version": "1.0.0", "version": "1.0.1",
"private": true, "private": true,
"workspaces": [ "workspaces": [
"apps/*", "apps/*",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@jorgecuadros/database", "name": "@jorgecuadros/database",
"version": "1.0.0", "version": "1.0.1",
"private": true, "private": true,
"main": "generated/client/index.js", "main": "generated/client/index.js",
"types": "generated/client/index.d.ts", "types": "generated/client/index.d.ts",