diff options
author | Máximo Cuadros <mcuadros@gmail.com> | 2017-12-20 16:58:42 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-12-20 16:58:42 +0100 |
commit | ca59809a0c74f6af498347a102a64242e26b0ab0 (patch) | |
tree | c259ce4ed5c22d86ad1b2036620944da880b2f9f /plumbing/format/packfile/object_pack.go | |
parent | 55b5d736682bf0e251c5bf83d1cf25c298d3ea0c (diff) | |
parent | c932bd462fed2ff470d9ff40f15102237a3287f8 (diff) | |
download | go-git-ca59809a0c74f6af498347a102a64242e26b0ab0.tar.gz |
Merge pull request #697 from ajnavarro/performance/improve-delta-reusing
plumbing: packafile, improve delta reutilization
Diffstat (limited to 'plumbing/format/packfile/object_pack.go')
-rw-r--r-- | plumbing/format/packfile/object_pack.go | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/plumbing/format/packfile/object_pack.go b/plumbing/format/packfile/object_pack.go index e22e783..1563517 100644 --- a/plumbing/format/packfile/object_pack.go +++ b/plumbing/format/packfile/object_pack.go @@ -13,12 +13,16 @@ type ObjectToPack struct { // If the main object is not a delta, Base will be null Base *ObjectToPack // Original is the object that we can generate applying the delta to - // Base, or the same object as EncodedObject in the case of a non-delta + // Base, or the same object as Object in the case of a non-delta // object. Original plumbing.EncodedObject // Depth is the amount of deltas needed to resolve to obtain Original // (delta based on delta based on ...) Depth int + + // offset in pack when object has been already written, or 0 if it + // has not been written yet + Offset int64 } // newObjectToPack creates a correct ObjectToPack based on a non-delta object @@ -41,6 +45,32 @@ func newDeltaObjectToPack(base *ObjectToPack, original, delta plumbing.EncodedOb } } +// BackToOriginal converts that ObjectToPack to a non-deltified object if it was one +func (o *ObjectToPack) BackToOriginal() { + if o.IsDelta() { + o.Object = o.Original + o.Base = nil + o.Depth = 0 + } +} + +// IsWritten returns if that ObjectToPack was +// already written into the packfile or not +func (o *ObjectToPack) IsWritten() bool { + return o.Offset > 1 +} + +// MarkWantWrite marks this ObjectToPack as WantWrite +// to avoid delta chain loops +func (o *ObjectToPack) MarkWantWrite() { + o.Offset = 1 +} + +// WantWrite checks if this ObjectToPack was marked as WantWrite before +func (o *ObjectToPack) WantWrite() bool { + return o.Offset == 1 +} + func (o *ObjectToPack) Type() plumbing.ObjectType { if o.Original != nil { return o.Original.Type() |