Adds Git LFS support to the backend API and related UI. The app now exposes commands to inspect, install, track and pull. A sidecar git-lfs binary is bundled and a prep script is added. This prepares the correct binary for each target platform. - Expose Git LFS status and management commands in API - Bundle and prepare a sidecar git-lfs binary for targets - Update packaging, docs, and README with LFS notes
72 lines
2.5 KiB
JavaScript
72 lines
2.5 KiB
JavaScript
import { copyFileSync, existsSync, mkdirSync, chmodSync, statSync } from "node:fs";
|
|
import { basename, delimiter, dirname, join, resolve } from "node:path";
|
|
import { fileURLToPath } from "node:url";
|
|
|
|
const scriptDirectory = dirname(fileURLToPath(import.meta.url));
|
|
const projectRoot = resolve(scriptDirectory, "..");
|
|
const binariesDirectory = join(projectRoot, "src-tauri", "binaries");
|
|
const extension = process.platform === "win32" ? ".exe" : "";
|
|
|
|
function defaultTargetTriple() {
|
|
const triples = {
|
|
"win32:x64": "x86_64-pc-windows-msvc",
|
|
"win32:arm64": "aarch64-pc-windows-msvc",
|
|
"linux:x64": "x86_64-unknown-linux-gnu",
|
|
"linux:arm64": "aarch64-unknown-linux-gnu",
|
|
"darwin:x64": "x86_64-apple-darwin",
|
|
"darwin:arm64": "aarch64-apple-darwin",
|
|
};
|
|
return triples[`${process.platform}:${process.arch}`];
|
|
}
|
|
|
|
function executableCandidates() {
|
|
const configured = process.env.GIT_LFS_BINARY?.trim();
|
|
if (configured) return [configured];
|
|
|
|
const pathEntries = (process.env.PATH ?? "")
|
|
.split(delimiter)
|
|
.filter(Boolean);
|
|
const candidates = pathEntries.map((entry) => join(entry, `git-lfs${extension}`));
|
|
if (process.platform === "win32") {
|
|
for (const entry of pathEntries) {
|
|
if (basename(entry).toLowerCase() === "cmd") {
|
|
candidates.push(resolve(entry, "..", "mingw64", "bin", "git-lfs.exe"));
|
|
}
|
|
}
|
|
}
|
|
return candidates;
|
|
}
|
|
|
|
const source = executableCandidates()
|
|
.filter((candidate) => existsSync(candidate))
|
|
// Git for Windows exposes a small launcher in cmd/ and the standalone
|
|
// executable in mingw64/bin/. The standalone file is the portable sidecar.
|
|
.sort((left, right) => statSync(right).size - statSync(left).size)[0];
|
|
if (!source) {
|
|
throw new Error(
|
|
"Git LFS was not found. Install git-lfs or set GIT_LFS_BINARY before building Gitty.",
|
|
);
|
|
}
|
|
|
|
const targetTriple = (
|
|
process.env.GITTY_TARGET_TRIPLE
|
|
?? process.env.TAURI_ENV_TARGET_TRIPLE
|
|
?? process.env.TARGET
|
|
?? defaultTargetTriple()
|
|
)?.trim();
|
|
if (!targetTriple) throw new Error("Rust did not report a target triple.");
|
|
|
|
mkdirSync(binariesDirectory, { recursive: true });
|
|
|
|
const developmentTarget = join(binariesDirectory, `git-lfs${extension}`);
|
|
const bundleTarget = join(
|
|
binariesDirectory,
|
|
`git-lfs-${targetTriple}${extension}`,
|
|
);
|
|
for (const target of [developmentTarget, bundleTarget]) {
|
|
if (resolve(source) !== resolve(target)) copyFileSync(source, target);
|
|
if (process.platform !== "win32") chmodSync(target, 0o755);
|
|
}
|
|
|
|
console.log(`Prepared bundled git-lfs from ${source} for ${targetTriple}.`);
|