UNPKG

tiny-commit-walker

Version:
72 lines 2.16 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function readBaseOffset(buff, offset) { let c = buff[offset++]; let baseOffset = c & 0x7f; while (c & 0x80) { baseOffset++; c = buff[offset++]; baseOffset = baseOffset * 128 + (c & 0x7f); } return [baseOffset, offset]; } exports.readBaseOffset = readBaseOffset; function readDataSize(buff, offset) { let cmd; let size = 0; let x = 1; do { cmd = buff[offset++]; size += (cmd & 0x7f) * x; x *= 128; } while (cmd & 0x80); return [size, offset]; } function patchDelta(src, delta) { let srcOffset = 0; let srcSize; let dstSize; [srcSize, srcOffset] = readDataSize(delta, srcOffset); [dstSize, srcOffset] = readDataSize(delta, srcOffset); let dstOffset = 0; let cmd; const dst = Buffer.alloc(dstSize); while (srcOffset < delta.length) { cmd = delta[srcOffset++]; if (cmd & 0x80) { let cpOff = 0; let cpSize = 0; if (cmd & 0x01) cpOff = delta[srcOffset++]; if (cmd & 0x02) cpOff |= (delta[srcOffset++] << 8); if (cmd & 0x04) cpOff |= (delta[srcOffset++] << 16); if (cmd & 0x08) cpOff |= (delta[srcOffset++] << 24); if (cmd & 0x10) cpSize = delta[srcOffset++]; if (cmd & 0x20) cpSize |= (delta[srcOffset++] << 8); if (cmd & 0x40) cpSize |= (delta[srcOffset++] << 16); if (cpSize === 0) cpSize = 0x10000; dst.set(src.slice(cpOff, cpOff + cpSize), dstOffset); dstOffset += cpSize; dstSize -= cpSize; } else if (cmd) { if (cmd > dstSize) { break; } dst.set(delta.slice(srcOffset, srcOffset + cmd), dstOffset); dstOffset += cmd; srcOffset += cmd; dstSize -= cmd; } } return dst; } exports.patchDelta = patchDelta; //# sourceMappingURL=delta.js.map