ref: 0109f0903d8e18d110d6b9456f9a1fb4501e62fc
parent: 9da262c92189e4007834bf2023f0c032f2a1a0d9
author: Runxi Yu <runxiyu@umich.edu>
date: Sun Mar 29 07:05:46 EDT 2026
object/type, format/packfile: API cleanups
--- a/format/packfile/header.go
+++ b/format/packfile/header.go
@@ -3,7 +3,7 @@
// 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 {+// SupportedVersion reports whether one pack version is supported.
+func SupportedVersion(version uint32) bool {return version == 2 || version == 3
}
--- a/format/packfile/ingest/drain.go
+++ b/format/packfile/ingest/drain.go
@@ -4,7 +4,6 @@
"fmt"
"io"
- packfmt "codeberg.org/lindenii/furgit/format/packfile"
"codeberg.org/lindenii/furgit/internal/compress/zlib"
objectheader "codeberg.org/lindenii/furgit/object/header"
objectid "codeberg.org/lindenii/furgit/object/id"
@@ -25,7 +24,7 @@
var total int64
- if packfmt.IsBaseObjectType(record.packedType) {+ if record.packedType.IsBaseObject() {header, ok := objectheader.Encode(record.packedType, record.declaredSize)
if !ok { return 0, zero, &MalformedPackEntryError{Offset: record.offset, Reason: "encode object header"}--- a/format/packfile/ingest/entry.go
+++ b/format/packfile/ingest/entry.go
@@ -3,7 +3,6 @@
import (
"fmt"
- packfmt "codeberg.org/lindenii/furgit/format/packfile"
objecttype "codeberg.org/lindenii/furgit/object/type"
)
@@ -54,7 +53,7 @@
record.crc32 = crc
- if packfmt.IsBaseObjectType(record.packedType) {+ if record.packedType.IsBaseObject() {record.objectID = oid
record.realType = record.packedType
record.resolved = true
--- a/format/packfile/ingest/header.go
+++ b/format/packfile/ingest/header.go
@@ -36,7 +36,7 @@
}
version := binary.BigEndian.Uint32(hdr[4:8])
- if !packfile.VersionSupported(version) {+ if !packfile.SupportedVersion(version) { return HeaderInfo{}, &InvalidPackHeaderError{ Reason: fmt.Sprintf("unsupported version %d", version),}
--- a/format/packfile/ingest/record_content.go
+++ b/format/packfile/ingest/record_content.go
@@ -3,7 +3,6 @@
import (
"fmt"
- packfmt "codeberg.org/lindenii/furgit/format/packfile"
objecttype "codeberg.org/lindenii/furgit/object/type"
)
@@ -10,7 +9,7 @@
// readBaseRecordContent reads canonical base content for one non-delta record.
func readBaseRecordContent(state *ingestState, idx int) (objecttype.Type, []byte, error) {record := state.records[idx]
- if !packfmt.IsBaseObjectType(record.packedType) {+ if !record.packedType.IsBaseObject() { return objecttype.TypeInvalid, nil, fmt.Errorf("packfile/ingest: record %d is not a base object", idx)}
--- a/format/packfile/ingest/record_resolve.go
+++ b/format/packfile/ingest/record_resolve.go
@@ -3,7 +3,6 @@
import (
"fmt"
- packfmt "codeberg.org/lindenii/furgit/format/packfile"
objecttype "codeberg.org/lindenii/furgit/object/type"
)
@@ -25,7 +24,7 @@
return ty, content, nil
}
- if packfmt.IsBaseObjectType(record.packedType) {+ if record.packedType.IsBaseObject() {ty, content, err := readBaseRecordContent(state, idx)
if err != nil {return objecttype.TypeInvalid, nil, err
--- a/format/packfile/object_type.go
+++ /dev/null
@@ -1,16 +1,0 @@
-package packfile
-
-import objecttype "codeberg.org/lindenii/furgit/object/type"
-
-// 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
- }
-}
--- a/object/store/packed/delta_build_chain.go
+++ b/object/store/packed/delta_build_chain.go
@@ -3,7 +3,6 @@
import (
"fmt"
- packfmt "codeberg.org/lindenii/furgit/format/packfile"
objecttype "codeberg.org/lindenii/furgit/object/type"
)
@@ -26,7 +25,7 @@
return deltaChain{}, err}
- if packfmt.IsBaseObjectType(meta.ty) {+ if meta.ty.IsBaseObject() {chain.baseLoc = current
chain.baseType = meta.ty
--- a/object/store/packed/delta_resolve_chain_start.go
+++ b/object/store/packed/delta_resolve_chain_start.go
@@ -3,7 +3,6 @@
import (
"fmt"
- packfmt "codeberg.org/lindenii/furgit/format/packfile"
objecttype "codeberg.org/lindenii/furgit/object/type"
)
@@ -38,7 +37,7 @@
return objecttype.TypeInvalid, nil, 0, err
}
- if !packfmt.IsBaseObjectType(meta.ty) {+ if !meta.ty.IsBaseObject() { return objecttype.TypeInvalid, nil, 0, fmt.Errorf("objectstore/packed: delta chain base is not a base object")}
--- a/object/store/packed/delta_resolve_content.go
+++ b/object/store/packed/delta_resolve_content.go
@@ -1,9 +1,6 @@
package packed
-import (
- packfmt "codeberg.org/lindenii/furgit/format/packfile"
- objecttype "codeberg.org/lindenii/furgit/object/type"
-)
+import objecttype "codeberg.org/lindenii/furgit/object/type"
// deltaResolveContent resolves one object's content bytes from its pack location.
func (store *Store) deltaResolveContent(start location) (objecttype.Type, []byte, error) {@@ -18,7 +15,7 @@
}
declaredSize := meta.size
- if !packfmt.IsBaseObjectType(meta.ty) {+ if !meta.ty.IsBaseObject() {declaredSize, err = deltaDeclaredSizeAt(pack, meta.dataOffset)
if err != nil {return objecttype.TypeInvalid, nil, err
--- a/object/store/packed/pack.go
+++ b/object/store/packed/pack.go
@@ -47,7 +47,7 @@
}
version := binary.BigEndian.Uint32(data[4:8])
- if !packfmt.VersionSupported(version) {+ if !packfmt.SupportedVersion(version) {_ = syscall.Munmap(data)
return nil, fmt.Errorf("objectstore/packed: pack %q unsupported version %d", name, version)--- a/object/store/packed/read_header_resolve.go
+++ b/object/store/packed/read_header_resolve.go
@@ -3,7 +3,6 @@
import (
"fmt"
- packfmt "codeberg.org/lindenii/furgit/format/packfile"
objecttype "codeberg.org/lindenii/furgit/object/type"
)
@@ -26,7 +25,7 @@
}
if declaredSize < 0 {- if packfmt.IsBaseObjectType(meta.ty) {+ if meta.ty.IsBaseObject() {declaredSize = meta.size
} else {size, err := deltaDeclaredSizeAt(pack, meta.dataOffset)
@@ -38,7 +37,7 @@
}
}
- if packfmt.IsBaseObjectType(meta.ty) {+ if meta.ty.IsBaseObject() {return meta.ty, declaredSize, nil
}
--- a/object/store/packed/read_reader.go
+++ b/object/store/packed/read_reader.go
@@ -5,7 +5,6 @@
"fmt"
"io"
- packfmt "codeberg.org/lindenii/furgit/format/packfile"
"codeberg.org/lindenii/furgit/internal/iolimit"
objectheader "codeberg.org/lindenii/furgit/object/header"
objectid "codeberg.org/lindenii/furgit/object/id"
@@ -30,7 +29,7 @@
return objecttype.TypeInvalid, 0, nil, err
}
- if packfmt.IsBaseObjectType(meta.ty) {+ if meta.ty.IsBaseObject() {zr, err := zlibReaderAt(pack, meta.dataOffset)
if err != nil {return objecttype.TypeInvalid, 0, nil, err
@@ -67,7 +66,7 @@
return nil, err
}
- if packfmt.IsBaseObjectType(meta.ty) {+ if meta.ty.IsBaseObject() {header, ok := objectheader.Encode(meta.ty, meta.size)
if !ok { return nil, fmt.Errorf("objectstore/packed: failed to encode object header for type %d", meta.ty)--- a/object/store/packed/read_size.go
+++ b/object/store/packed/read_size.go
@@ -3,7 +3,6 @@
import (
"fmt"
- packfmt "codeberg.org/lindenii/furgit/format/packfile"
objectid "codeberg.org/lindenii/furgit/object/id"
objecttype "codeberg.org/lindenii/furgit/object/type"
)
@@ -29,7 +28,7 @@
return 0, err
}
- if packfmt.IsBaseObjectType(meta.ty) {+ if meta.ty.IsBaseObject() {return meta.size, nil
}
--- a/object/type/objecttype.go
+++ b/object/type/objecttype.go
@@ -14,3 +14,16 @@
TypeOfsDelta Type = 6
TypeRefDelta Type = 7
)
+
+// IsBaseObject reports whether ty is one of the four canonical Git object
+// types encoded directly in pack entries.
+func (ty Type) IsBaseObject() bool {+ switch ty {+ case TypeCommit, TypeTree, TypeBlob, TypeTag:
+ return true
+ case TypeInvalid, TypeFuture, TypeOfsDelta, TypeRefDelta:
+ return false
+ default:
+ return false
+ }
+}
--
⑨