UNPKG

alinea

Version:
71 lines (69 loc) 2.13 kB
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 };