shithub: furgit

Download patch

ref: f74018c19970d11a7ba0c89e581cb9f86c0d3c14
parent: dc7c74b9b0c6fe66bad9119b2d29e00f70a7cd3b
author: Runxi Yu <runxiyu@umich.edu>
date: Thu Mar 12 06:01:32 EDT 2026

packfile: Split to many files

--- /dev/null
+++ b/packfile/doc.go
@@ -1,0 +1,2 @@
+// Package packfile provides Git packfile format parsing primitives.
+package packfile
--- a/packfile/entry.go
+++ b/packfile/entry.go
@@ -6,51 +6,6 @@
 	"codeberg.org/lindenii/furgit/objecttype"
 )
 
-// EntryHeader is one parsed pack entry header prefix.
-type EntryHeader struct {
-	// Type is the entry type tag from the first header byte.
-	Type objecttype.Type
-	// Size is the declared resulting object size.
-	Size int64
-	// HeaderSize is the number of bytes consumed by the type/size header.
-	HeaderSize int
-}
-
-// ParseEntryHeader parses one pack entry type/size header from data.
-func ParseEntryHeader(data []byte) (EntryHeader, error) {
-	var zero EntryHeader
-	if len(data) == 0 {
-		return zero, fmt.Errorf("packfile: truncated entry header")
-	}
-
-	first := data[0]
-	header := EntryHeader{
-		Type:       objecttype.Type((first >> 4) & 0x07),
-		Size:       int64(first & 0x0f),
-		HeaderSize: 1,
-	}
-
-	shift := uint(4)
-
-	b := first
-	for b&0x80 != 0 {
-		if header.HeaderSize >= len(data) {
-			return zero, fmt.Errorf("packfile: truncated entry header")
-		}
-
-		b = data[header.HeaderSize]
-		header.HeaderSize++
-		header.Size |= int64(b&0x7f) << shift
-		shift += 7
-	}
-
-	if header.Size < 0 {
-		return zero, fmt.Errorf("packfile: negative entry size")
-	}
-
-	return header, nil
-}
-
 // Entry is one parsed pack entry prefix, including any delta base reference
 // data that appears before the compressed payload.
 type Entry struct {
--- /dev/null
+++ b/packfile/entry_header.go
@@ -1,0 +1,52 @@
+package packfile
+
+import (
+	"fmt"
+
+	"codeberg.org/lindenii/furgit/objecttype"
+)
+
+// EntryHeader is one parsed pack entry header prefix.
+type EntryHeader struct {
+	// Type is the entry type tag from the first header byte.
+	Type objecttype.Type
+	// Size is the declared resulting object size.
+	Size int64
+	// HeaderSize is the number of bytes consumed by the type/size header.
+	HeaderSize int
+}
+
+// ParseEntryHeader parses one pack entry type/size header from data.
+func ParseEntryHeader(data []byte) (EntryHeader, error) {
+	var zero EntryHeader
+	if len(data) == 0 {
+		return zero, fmt.Errorf("packfile: truncated entry header")
+	}
+
+	first := data[0]
+	header := EntryHeader{
+		Type:       objecttype.Type((first >> 4) & 0x07),
+		Size:       int64(first & 0x0f),
+		HeaderSize: 1,
+	}
+
+	shift := uint(4)
+
+	b := first
+	for b&0x80 != 0 {
+		if header.HeaderSize >= len(data) {
+			return zero, fmt.Errorf("packfile: truncated entry header")
+		}
+
+		b = data[header.HeaderSize]
+		header.HeaderSize++
+		header.Size |= int64(b&0x7f) << shift
+		shift += 7
+	}
+
+	if header.Size < 0 {
+		return zero, fmt.Errorf("packfile: negative entry size")
+	}
+
+	return header, nil
+}
--- /dev/null
+++ b/packfile/header.go
@@ -1,0 +1,9 @@
+package packfile
+
+// Signature is the 4-byte "PACK" magic at the start of pack files.
+const Signature = 0x5041434b
+
+// VersionSupported reports whether one pack version is supported.
+func VersionSupported(version uint32) bool {
+	return version == 2 || version == 3
+}
--- /dev/null
+++ b/packfile/object_type.go
@@ -1,0 +1,16 @@
+package packfile
+
+import "codeberg.org/lindenii/furgit/objecttype"
+
+// IsBaseObjectType reports whether ty is one of the four canonical object
+// types encoded directly in pack entries.
+func IsBaseObjectType(ty objecttype.Type) bool {
+	switch ty {
+	case objecttype.TypeCommit, objecttype.TypeTree, objecttype.TypeBlob, objecttype.TypeTag:
+		return true
+	case objecttype.TypeInvalid, objecttype.TypeFuture, objecttype.TypeOfsDelta, objecttype.TypeRefDelta:
+		return false
+	default:
+		return false
+	}
+}
--- /dev/null
+++ b/packfile/ofs.go
@@ -1,0 +1,26 @@
+package packfile
+
+import "fmt"
+
+// ParseOfsDeltaDistance parses one ofs-delta backward distance.
+func ParseOfsDeltaDistance(buf []byte) (uint64, int, error) {
+	if len(buf) == 0 {
+		return 0, 0, fmt.Errorf("packfile: malformed ofs-delta distance")
+	}
+
+	b := buf[0]
+	dist := uint64(b & 0x7f)
+
+	consumed := 1
+	for b&0x80 != 0 {
+		if consumed >= len(buf) {
+			return 0, 0, fmt.Errorf("packfile: malformed ofs-delta distance")
+		}
+
+		b = buf[consumed]
+		consumed++
+		dist = ((dist + 1) << 7) + uint64(b&0x7f)
+	}
+
+	return dist, consumed, nil
+}
--- a/packfile/pack.go
+++ /dev/null
@@ -1,52 +1,0 @@
-// Package packfile provides Git packfile format parsing primitives.
-package packfile
-
-import (
-	"fmt"
-
-	"codeberg.org/lindenii/furgit/objecttype"
-)
-
-// Signature is the 4-byte "PACK" magic at the start of pack files.
-const Signature = 0x5041434b
-
-// VersionSupported reports whether one pack version is supported.
-func VersionSupported(version uint32) bool {
-	return version == 2 || version == 3
-}
-
-// IsBaseObjectType reports whether ty is one of the four canonical object
-// types encoded directly in pack entries.
-func IsBaseObjectType(ty objecttype.Type) bool {
-	switch ty {
-	case objecttype.TypeCommit, objecttype.TypeTree, objecttype.TypeBlob, objecttype.TypeTag:
-		return true
-	case objecttype.TypeInvalid, objecttype.TypeFuture, objecttype.TypeOfsDelta, objecttype.TypeRefDelta:
-		return false
-	default:
-		return false
-	}
-}
-
-// ParseOfsDeltaDistance parses one ofs-delta backward distance.
-func ParseOfsDeltaDistance(buf []byte) (uint64, int, error) {
-	if len(buf) == 0 {
-		return 0, 0, fmt.Errorf("packfile: malformed ofs-delta distance")
-	}
-
-	b := buf[0]
-	dist := uint64(b & 0x7f)
-
-	consumed := 1
-	for b&0x80 != 0 {
-		if consumed >= len(buf) {
-			return 0, 0, fmt.Errorf("packfile: malformed ofs-delta distance")
-		}
-
-		b = buf[consumed]
-		consumed++
-		dist = ((dist + 1) << 7) + uint64(b&0x7f)
-	}
-
-	return dist, consumed, nil
-}
--