diff --git a/.github/workflows/custom_build.yml b/.github/workflows/custom_build.yml index 2fd9eeb..21e9aaf 100644 --- a/.github/workflows/custom_build.yml +++ b/.github/workflows/custom_build.yml @@ -11,6 +11,9 @@ on: description: 'Build flags (e.g. -DMESHTASTIC_EXCLUDE_MQTT)' required: false type: string + version: + description: 'Firmware Version (Tag/Branch)' + required: true jobs: build: @@ -23,7 +26,7 @@ jobs: uses: actions/checkout@v4 with: repository: meshtastic/firmware - ref: develop + ref: ${{ inputs.version }} path: firmware submodules: recursive fetch-depth: 1 diff --git a/convex/actions.ts b/convex/actions.ts index 5e50a32..80cefc6 100644 --- a/convex/actions.ts +++ b/convex/actions.ts @@ -7,14 +7,15 @@ export const dispatchGithubBuild = action({ buildId: v.id("builds"), target: v.string(), flags: v.string(), + version: v.string(), }, handler: async (ctx, args) => { - try { - const githubToken = process.env.GITHUB_TOKEN; - if (!githubToken) { - throw new Error("GITHUB_TOKEN is not defined"); - } + const githubToken = process.env.GITHUB_TOKEN; + if (!githubToken) { + throw new Error("GITHUB_TOKEN is not set"); + } + try { const response = await fetch( "https://api.github.com/repos/MeshEnvy/configurable-web-flasher/actions/workflows/custom_build.yml/dispatches", { @@ -29,6 +30,7 @@ export const dispatchGithubBuild = action({ inputs: { target: args.target, flags: args.flags, + version: args.version, }, }), }, diff --git a/convex/builds.ts b/convex/builds.ts index 2f250a5..abd9d1e 100644 --- a/convex/builds.ts +++ b/convex/builds.ts @@ -38,6 +38,7 @@ export const triggerBuild = mutation({ buildId: buildId, target: target, flags: flags, + version: profile.version, }); } }, @@ -120,6 +121,7 @@ export const retryBuild = mutation({ buildId: args.buildId, target: build.target, flags: flags, + version: profile.version, }); }, }); diff --git a/convex/profiles.ts b/convex/profiles.ts index 8fb20bf..e4b81a7 100644 --- a/convex/profiles.ts +++ b/convex/profiles.ts @@ -20,6 +20,7 @@ export const create = mutation({ name: v.string(), targets: v.array(v.string()), config: v.any(), + version: v.string(), }, handler: async (ctx, args) => { const userId = await getAuthUserId(ctx); @@ -30,6 +31,7 @@ export const create = mutation({ name: args.name, targets: args.targets, config: args.config, + version: args.version, updatedAt: Date.now(), }); }, @@ -41,6 +43,7 @@ export const update = mutation({ name: v.string(), targets: v.array(v.string()), config: v.any(), + version: v.optional(v.string()), }, handler: async (ctx, args) => { const userId = await getAuthUserId(ctx); @@ -55,6 +58,7 @@ export const update = mutation({ name: args.name, targets: args.targets, config: args.config, + version: args.version, updatedAt: Date.now(), }); }, diff --git a/convex/schema.ts b/convex/schema.ts index 2915c3e..3a55360 100644 --- a/convex/schema.ts +++ b/convex/schema.ts @@ -9,6 +9,7 @@ export default defineSchema({ name: v.string(), targets: v.array(v.string()), // e.g. ["tbeam", "rak4631"] config: v.any(), // JSON object for flags + version: v.string(), updatedAt: v.number(), }).index("by_user", ["userId"]), diff --git a/package.json b/package.json index 3322dad..1aaa5ae 100644 --- a/package.json +++ b/package.json @@ -4,8 +4,9 @@ "version": "0.0.0", "type": "module", "scripts": { - "dev": "vite", - "build": "tsc && vite build", + "generate:versions": "node scripts/generate-versions.js", + "dev": "npm run generate:versions && vite", + "build": "npm run generate:versions && tsc && vite build", "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0", "preview": "vite preview" }, diff --git a/scripts/generate-versions.js b/scripts/generate-versions.js new file mode 100644 index 0000000..7caf459 --- /dev/null +++ b/scripts/generate-versions.js @@ -0,0 +1,46 @@ +import { execSync } from 'node:child_process'; +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +const FIRMWARE_DIR = path.resolve(__dirname, '../vendor/firmware'); +const OUTPUT_FILE = path.resolve(__dirname, '../src/constants/versions.ts'); + +function getVersions() { + try { + // Run git tag in the firmware directory + const output = execSync('git tag', { cwd: FIRMWARE_DIR, encoding: 'utf-8' }); + + // Filter and sort tags + // We are looking for tags like v2.5.0... + const tags = output + .split('\n') + .map(tag => tag.trim()) + .filter(tag => tag.startsWith('v') && tag.includes('.')) + // Simple sort for now, ideally semver sort but string sort works okay for fixed format vX.Y.Z + // We want reverse sort to show latest first + .sort((a, b) => b.localeCompare(a, undefined, { numeric: true, sensitivity: 'base' })); + + return tags; + } catch (error) { + console.error('Error getting git tags:', error); + return []; + } +} + +function generateFile(versions) { + const content = `// This file is auto-generated by scripts/generate-versions.js +export const VERSIONS = ${JSON.stringify(versions, null, '\t')} as const; + +export type FirmwareVersion = typeof VERSIONS[number]; +`; + + fs.writeFileSync(OUTPUT_FILE, content); + console.log(`Generated ${OUTPUT_FILE} with ${versions.length} versions`); +} + +const versions = getVersions(); +generateFile(versions); diff --git a/src/components/ProfileEditor.tsx b/src/components/ProfileEditor.tsx index 266dc3b..77a30ec 100644 --- a/src/components/ProfileEditor.tsx +++ b/src/components/ProfileEditor.tsx @@ -1,4 +1,5 @@ import { useMutation } from "convex/react"; +import * as React from "react"; import { useForm } from "react-hook-form"; import { Button } from "@/components/ui/button"; import { Checkbox } from "@/components/ui/checkbox"; diff --git a/src/constants/versions.ts b/src/constants/versions.ts new file mode 100644 index 0000000..7b188bc --- /dev/null +++ b/src/constants/versions.ts @@ -0,0 +1,242 @@ +// This file is auto-generated by scripts/generate-versions.js +export const VERSIONS = [ + "v2.7.15.567b8ea", + "v2.7.14.e959000", + "v2.7.13.597fa0b", + "v2.7.12.45f15b8", + "v2.7.11.ee68575", + "v2.7.10.94d4bdf", + "v2.7.9.70724be", + "v2.7.8.a0c0388", + "v2.7.7.5ae4ff9", + "v2.7.6.834c3c5", + "v2.7.5.ddd1499", + "v2.7.4.c1f4f79", + "v2.7.3.cf574c7", + "v2.7.2.f6d3782", + "v2.7.1.f35ca81", + "v2.7.0.705515a", + "v2.7.0.195b7cc", + "v2.6.13.0561f2c", + "v2.6.12.9861e82", + "v2.6.11.60ec05e", + "v2.6.10.9ce4455", + "v2.6.9.f223b8a", + "v2.6.8.ef9d0d7", + "v2.6.7.2d6181f", + "v2.6.6.54c1423", + "v2.6.5.fc3d9f2", + "v2.6.4.b89355f", + "v2.6.3.d28af68", + "v2.6.3.640e731", + "v2.6.2.31c0e8f", + "v2.6.1.7c3edde", + "v2.6.0.f7afa9a", + "v2.5.23.bf958ed", + "v2.5.22.d1fa27d", + "v2.5.21.447533a", + "v2.5.20.4c97351", + "v2.5.19.f9876cf", + "v2.5.19.d5cd6f8", + "v2.5.18.89ebafc", + "v2.5.17.b4b2fd6", + "v2.5.16.f81d3b0", + "v2.5.15.79da236", + "v2.5.14.f2ee0df", + "v2.5.13.295278b", + "v2.5.13.1a06f88", + "v2.5.12.aa184e6", + "v2.5.11.8e2a3e5", + "v2.5.10.0fc5c9b", + "v2.5.9.936260f", + "v2.5.8.6485f03", + "v2.5.7.f77c87d", + "v2.5.6.d55c08d", + "v2.5.5.e182ae7", + "v2.5.4.8d288d5", + "v2.5.3.a70d5ee", + "v2.5.2.771cb52", + "v2.5.1.c13b44b", + "v2.5.0.e470619", + "v2.5.0.d6dac17", + "v2.5.0.ab7de7f", + "v2.5.0.33eb073", + "v2.5.0.9e55e6b", + "v2.5.0.9ac0e26", + "v2.4.3.efc27f2", + "v2.4.3.91d6612", + "v2.4.2.5b45303", + "v2.4.1.394e0e1", + "v2.4.0.46d7b82", + "v2.3.15.deb7c27", + "v2.3.14.64531fa", + "v2.3.13.83f5ba0", + "v2.3.12.24458a7", + "v2.3.11.2740a56", + "v2.3.10.d19607b", + "v2.3.9.f06c56a", + "v2.3.8.d490a33", + "v2.3.7.30fbcab", + "v2.3.6.7a3570a", + "v2.3.5.2f9b68e", + "v2.3.4.ea61808", + "v2.3.3.8187fa7", + "v2.3.2.63df972", + "v2.3.1.4fa7f5a", + "v2.3.0.5f47ca1", + "v2.2.24.e6a2c06", + "v2.2.23.5672e68", + "v2.2.22.404d0dd", + "v2.2.21.7f7c5cb", + "v2.2.20.af5ac32", + "v2.2.19.8f6a283", + "v2.2.18.e9bde80", + "v2.2.17.dbac2b1", + "v2.2.16.1c6acfd", + "v2.2.15.31c4693", + "v2.2.14.57542ce", + "v2.2.13.f570204", + "v2.2.12.092e6f2", + "v2.2.11.10265aa", + "v2.2.10.7cebd79", + "v2.2.9.47301a5", + "v2.2.8.61f6fb2", + "v2.2.7.e8970ad", + "v2.2.6.b53cb38", + "v2.2.5.8255128", + "v2.2.4.3bcab0e", + "v2.2.3.282cc0b", + "v2.2.2.f35c7be", + "v2.2.1.fb5f2e4", + "v2.2.0.9f6584b", + "v2.1.23.04bbdc6", + "v2.1.22.191a69d", + "v2.1.21.97d7a89", + "v2.1.20.470363d", + "v2.1.19.eb7025f", + "v2.1.18.de53280", + "v2.1.17.7ca2e81", + "v2.1.16.a2c5b92", + "v2.1.15.cd78723", + "v2.1.14.99a31c1", + "v2.1.13.7475c86", + "v2.1.12.7711b03", + "v2.1.11.5ec624d", + "v2.1.10.7ef12c7", + "v2.1.9.d43ddc9", + "v2.1.8.ee971e3", + "v2.1.7.242f880", + "v2.1.6.5679a82", + "v2.1.5.23272da", + "v2.1.4.958d2cf", + "v2.1.3.8c68d88", + "v2.1.2.6d20215", + "v2.1.1.dc2ca9c", + "v2.1.0.331a1af", + "v2.0.23.7bb281d", + "v2.0.22.fbfd0f1", + "v2.0.21.83e6cea", + "v2.0.20.7100416", + "v2.0.19.3209aea", + "v2.0.18.1a7991c", + "v2.0.17.5d1c06b", + "v2.0.16.2242b68", + "v2.0.15.aafbde0", + "v2.0.14.2baaad8", + "v2.0.13.7e27729", + "v2.0.12.2400dd4", + "v2.0.11.8914d1a", + "v2.0.10.e09b12c", + "v2.0.9.6ea0963", + "v2.0.8.090e166", + "v2.0.7.91ff7b9", + "v2.0.6.97fd5cf", + "v2.0.5.65e8209", + "v2.0.4.5417671", + "v2.0.3.09fe616", + "v2.0.2.8146e84", + "v2.0.1.ad05b91", + "v2.0.0.18ab874", + "v1.3.48.82bcd39", + "v1.3.47.05147c0", + "v1.3.46.d4ea956", + "v1.3.45.b0d0552", + "v1.3.44.4fa8d02", + "v1.3.43.aae9d2f", + "v1.3.42.9bd9252", + "v1.3.41.80ddb81", + "v1.3.40.e87ecc2", + "v1.3.39.ddc3727", + "v1.3.38.1253abd", + "v1.3.37.97712a9", + "v1.3.36.dd720f2", + "v1.3.36.64f852e", + "v1.3.36.7e03019", + "v1.3.35.3251cd5", + "v1.3.34.401b5d9", + "v1.3.33.ab0095c", + "v1.3.32.7e6c22f", + "v1.3.31.0084643", + "v1.3.30.9fe2ddb", + "v1.3.29.7afc149", + "v1.3.28.41f9541", + "v1.3.27.c88ba58", + "v1.3.26.0010231", + "v1.3.25.85f46d3", + "v1.3.24.dff6915", + "v1.3.23.5462d84", + "v1.3.22.c725a6b", + "v1.3.21.cf00ac5", + "v1.3.20.9a5ff93", + "v1.3.19.3c6a2f7", + "v1.3.17.c9822de", + "v1.3.16.97899ae", + "v1.3.15.432d067", + "v1.3.13.71a43a9", + "v1.3.12.6306c53", + "v1.3.11.0411401", + "v1.3.10.cc2a84a", + "v1.3.10.4df0e91", + "v1.3.9.92185e7", + "v1.3.8.90df7c2", + "v1.3.7.bb22b6e", + "v1.3.6.f511bab", + "v1.3.5.e5b19fd", + "v1.3.4.2b20bf3", + "v1.3.3.2fe124e", + "v1.2.testing1", + "v1.2.65.0adc5ce", + "v1.2.64.fc48fcd", + "v1.2.63.9879494", + "v1.2.62.3ddd74e", + "v1.2.61.d551c17", + "v1.2.60.ab959de", + "v1.2.59.d81c1c0", + "v1.2.58.6af1822", + "v1.2.57.f7c6955", + "v1.2.56.596a73c", + "v1.2.55.9db7c62", + "v1.2.54.288f2be", + "v1.2.53.19c1f9f", + "v1.2.52.b63802c", + "v1.2.51.f9ff06b", + "v1.2.50.41dcfdd", + "v1.2.49.5354c49", + "v1.2.48.371335e", + "v1.2.47", + "v1.2.46.dce2fe4", + "v1.2.46.9d21e58", + "v1.2.45.b674054", + "v1.2.44.f2c9c55", + "v1.2.43.a405d81", + "v1.2.42.2759c8d", + "v1.2.41.32f3682", + "v1.2.39.06892c4", + "v1.2.38.cf4e508", + "v1.2.38.451b085", + "v1.2.36", + "v1.2.30.80e4bc6", + "v1.2.29.6c95659" +] as const; + +export type FirmwareVersion = typeof VERSIONS[number]; diff --git a/src/pages/Dashboard.tsx b/src/pages/Dashboard.tsx index e28d35d..ff499bb 100644 --- a/src/pages/Dashboard.tsx +++ b/src/pages/Dashboard.tsx @@ -71,6 +71,10 @@ export default function Dashboard() { className="border border-slate-800 rounded-lg p-6 bg-slate-900/50" >
+ Version:{" "} + {profile.version} +
Targets: {profile.targets.join(", ")}