From 42ff39c8d340dabce79c4057a07a3932da295772 Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Sat, 21 Feb 2026 18:44:45 +0800 Subject: format/delta/apply: Move core delta apply algorithm here --- format/delta/apply/header.go | 49 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 format/delta/apply/header.go (limited to 'format/delta/apply/header.go') diff --git a/format/delta/apply/header.go b/format/delta/apply/header.go new file mode 100644 index 00000000..f6aadea3 --- /dev/null +++ b/format/delta/apply/header.go @@ -0,0 +1,49 @@ +package apply + +import ( + "fmt" + "io" +) + +// ReadHeaderSizes reads the first two varints in one inflated delta stream. +func ReadHeaderSizes(reader io.Reader) (int, int, error) { + // Two Git varints are read here. Each can take up to 10 bytes. + var buf [20]byte + n := 0 + + for { + if n >= len(buf) { + return 0, 0, fmt.Errorf("format/delta/apply: malformed delta varint") + } + if _, err := io.ReadFull(reader, buf[n:n+1]); err != nil { + return 0, 0, fmt.Errorf("format/delta/apply: malformed delta varint: %w", err) + } + n++ + if buf[n-1]&0x80 == 0 { + break + } + } + pos := 0 + srcSize, err := readVarint(buf[:n], &pos) + if err != nil { + return 0, 0, err + } + + for { + if n >= len(buf) { + return 0, 0, fmt.Errorf("format/delta/apply: malformed delta varint") + } + if _, err := io.ReadFull(reader, buf[n:n+1]); err != nil { + return 0, 0, fmt.Errorf("format/delta/apply: malformed delta varint: %w", err) + } + n++ + if buf[n-1]&0x80 == 0 { + break + } + } + dstSize, err := readVarint(buf[:n], &pos) + if err != nil { + return 0, 0, err + } + return srcSize, dstSize, nil +} -- cgit v1.3.1-10-gc9f91