shithub: furgit

Download patch

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 {
--