blob: 9113b80f5b38e58eddcf051388bcf841141784af (
about) (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
package furgit
const defaultDeltaWindow = 64
type objectToPack struct {
id Hash
ty ObjectType
body []byte
offset uint64
deltaDepth int
}
type deltaContext struct {
window int
candidates []*objectToPack
}
func (ctx *deltaContext) addCandidate(obj *objectToPack) {
if ctx.window <= 0 {
return
}
ctx.candidates = append(ctx.candidates, obj)
if len(ctx.candidates) > ctx.window {
over := len(ctx.candidates) - ctx.window
ctx.candidates = ctx.candidates[over:]
}
}
func pickDeltaBase(ctx *deltaContext, obj *objectToPack, seed uint64, minSavings, maxDepth int) (*objectToPack, []byte) {
if ctx == nil || len(ctx.candidates) == 0 {
return nil, nil
}
if maxDepth <= 0 {
maxDepth = 1
}
var bestBase *objectToPack
var bestDelta []byte
for i := len(ctx.candidates) - 1; i >= 0; i-- {
base := ctx.candidates[i]
if base.ty != ObjectTypeBlob {
continue
}
if base.deltaDepth >= maxDepth {
continue
}
delta, ok := deltaTry(base.body, obj.body, seed, minSavings)
if !ok {
continue
}
if bestDelta == nil || len(delta) < len(bestDelta) {
bestDelta = delta
bestBase = base
}
}
return bestBase, bestDelta
}
|