ref: 86d95962ec8f2329aa591c00031bde68b0bab777
parent: 3d67169329b50d585b231452486c87c9761bf967
author: Runxi Yu <me@runxiyu.org>
date: Fri Feb 20 07:40:45 EST 2026
Revert "packed, delta: Some improvements for base selection" This reverts commit c1f17baa57bad0f61e639fc39c8cd5e4872142f6.
--- a/README.md
+++ b/README.md
@@ -31,7 +31,6 @@
* Multi pack indexes
* Repack
* Better delta base selection strategy
-* Delta reuse; delta islands
* Reading reachability bitmaps
* Writing reachability bitmaps when writing packfiles
* [commit-graph](https://git-scm.com/docs/commit-graph) (in progress)
--- a/delta_write_select.go
+++ b/delta_write_select.go
@@ -6,11 +6,9 @@
id Hash
ty ObjectType
body []byte
- size int
offset uint64
deltaDepth int
inPack bool
- preferred bool
}
type deltaContext struct {@@ -38,8 +36,6 @@
}
var bestBase *objectToPack
var bestDelta []byte
- var bestPreferred *objectToPack
- var bestPreferredDelta []byte
for i := len(ctx.candidates) - 1; i >= 0; i-- {base := ctx.candidates[i]
if base.ty != ObjectTypeBlob {@@ -48,60 +44,14 @@
if base.deltaDepth >= maxDepth {continue
}
- if !deltaSizeOk(base, obj, maxDepth) {- continue
- }
delta, ok := deltaTry(base.body, obj.body, seed, minSavings)
- if base.preferred {- delta, ok = deltaTry(base.body, obj.body, seed, 0)
- }
if !ok {continue
}
- if base.preferred {- if bestPreferredDelta == nil || len(delta) < len(bestPreferredDelta) {- bestPreferredDelta = delta
- bestPreferred = base
- }
- continue
- }
if bestDelta == nil || len(delta) < len(bestDelta) {bestDelta = delta
bestBase = base
}
}
- if bestPreferred != nil {- return bestPreferred, bestPreferredDelta
- }
return bestBase, bestDelta
-}
-
-func deltaSizeOk(base, target *objectToPack, maxDepth int) bool {- if base == nil || target == nil {- return false
- }
- if base.size <= 0 || target.size <= 0 {- return false
- }
- if maxDepth <= 0 {- maxDepth = 1
- }
- if base.deltaDepth >= maxDepth {- return false
- }
- if target.size < base.size/32 {- return false
- }
- maxSize := target.size/2 - 32
- if maxSize <= 0 {- return false
- }
- sizediff := 0
- if base.size < target.size {- sizediff = target.size - base.size
- }
- if sizediff >= maxSize {- return false
- }
- return true
}
--- a/packed_write_pack.go
+++ b/packed_write_pack.go
@@ -5,7 +5,6 @@
"encoding/binary"
"hash"
"io"
- "sort"
"codeberg.org/lindenii/furgit/internal/zlib"
)
@@ -311,15 +310,10 @@
return Hash{}, ErrInvalidObject}
- objInfos, err := repo.packBuildObjectList(objects, opts.EnableDeltas)
+ pw, err := newPackWriter(w, repo.hashAlgo, uint32(len(objects)))
if err != nil { return Hash{}, err}
-
- pw, err := newPackWriter(w, repo.hashAlgo, uint32(len(objInfos)))
- if err != nil {- return Hash{}, err- }
if err := pw.WriteHeader(); err != nil { return Hash{}, err}
@@ -341,16 +335,15 @@
}
}
- for _, info := range objInfos {- ty, body, err := repo.ReadObjectTypeRaw(info.id)
+ for _, id := range objects {+ ty, body, err := repo.ReadObjectTypeRaw(id)
if err != nil { return Hash{}, err}
obj := &objectToPack{- id: info.id,
+ id: id,
ty: ty,
body: body,
- size: info.size,
inPack: true,
}
startOffset := pw.bytesWritten
@@ -421,57 +414,14 @@
return err
}
candidate := &objectToPack{- id: obj.ID,
- ty: ty,
- body: body,
- size: len(body),
- inPack: false,
- preferred: true,
+ id: obj.ID,
+ ty: ty,
+ body: body,
+ inPack: false,
}
ctx.addCandidate(candidate)
}
return walk.Err()
-}
-
-type packObjectInfo struct {- id Hash
- ty ObjectType
- size int
- index int
-}
-
-func (repo *Repository) packBuildObjectList(objects []Hash, enableDeltas bool) ([]packObjectInfo, error) {- if repo == nil {- return nil, ErrInvalidObject
- }
- infos := make([]packObjectInfo, 0, len(objects))
- for i, id := range objects {- ty, size, err := repo.ReadObjectTypeSize(id)
- if err != nil {- return nil, err
- }
- infos = append(infos, packObjectInfo{- id: id,
- ty: ty,
- size: int(size),
- index: i,
- })
- }
- if !enableDeltas {- return infos, nil
- }
- sort.SliceStable(infos, func(i, j int) bool {- ai := infos[i]
- aj := infos[j]
- if ai.ty != aj.ty {- return ai.ty < aj.ty
- }
- if ai.size != aj.size {- return ai.size > aj.size
- }
- return ai.index < aj.index
- })
- return infos, nil
}
type packWriteOptions struct {--
⑨