alinea
Version:
Headless git-based CMS
71 lines (69 loc) • 2.13 kB
JavaScript
import "../../chunks/chunk-NZLE2WMY.js";
// src/core/source/GitUtils.ts
import { assert } from "../util/Assert.js";
import {
bytesToHex,
compareStrings,
concatUint8Arrays,
hexToBytes,
sha1Hash
} from "./Utils.js";
var encoder = new TextEncoder();
var decoder = new TextDecoder();
function serializeTreeEntries(entries) {
const sortedEntries = entries.slice().sort(compareEntries);
const entryBytesList = sortedEntries.map((entry) => {
const mode = entry.mode.startsWith("0") ? entry.mode.slice(1) : entry.mode;
const prefix = `${mode} ${entry.name}\0`;
const prefixBytes = encoder.encode(prefix);
const sha1Bytes = hexToBytes(entry.sha);
return new Uint8Array([...prefixBytes, ...sha1Bytes]);
});
return concatUint8Arrays(entryBytesList);
}
function compareEntries(a, b) {
const aName = a.entries ? `${a.name}/` : a.name;
const bName = b.entries ? `${b.name}/` : b.name;
return compareStrings(aName, bName);
}
function parseTreeEntries(data) {
let pos = 0;
const entries = [];
while (pos < data.length) {
const spacePos = data.indexOf(32, pos);
assert(spacePos > -1, "Invalid tree entry: missing space");
const mode = decoder.decode(data.slice(pos, spacePos)).padStart(6, "0");
const nullPos = data.indexOf(0, spacePos);
assert(nullPos > -1, "Invalid tree entry: missing null byte");
const name = decoder.decode(data.slice(spacePos + 1, nullPos));
const sha1Start = nullPos + 1;
const sha1Bytes = data.slice(sha1Start, sha1Start + 20);
const sha = bytesToHex(sha1Bytes);
entries.push({
sha,
name,
mode
});
pos = sha1Start + 20;
}
return entries;
}
function hashObject(type, data) {
const header = `${type} ${data.length}\0`;
const headerBytes = encoder.encode(header);
const blobObject = concatUint8Arrays([headerBytes, data]);
return sha1Hash(blobObject);
}
function hashTree(serializedTree) {
return hashObject("tree", serializedTree);
}
async function hashBlob(data) {
return hashObject("blob", data);
}
export {
hashBlob,
hashObject,
hashTree,
parseTreeEntries,
serializeTreeEntries
};