aboutsummaryrefslogtreecommitdiffstats
path: root/plumbing/format/packfile/object_pack.go
diff options
context:
space:
mode:
authorJavi Fontan <jfontan@gmail.com>2018-01-24 18:32:16 +0100
committerJavi Fontan <jfontan@gmail.com>2018-01-24 18:38:59 +0100
commit522327b572276fe94e76ff9bb5e41b1efdf69dee (patch)
treeed78c69b60e9c6cfb939a712077bd6f32776870c /plumbing/format/packfile/object_pack.go
parent834cd6f46fa3a3f2b5423f717cc72769e27c915b (diff)
downloadgo-git-522327b572276fe94e76ff9bb5e41b1efdf69dee.tar.gz
plumbing: format/packfile, fix crash with cycle deltas
Resolving cycles relied on ObjectToPack objects having Original. This is no longer true with the changes from #720. This commit changes: * Save original type, hash and size in ObjectToPack * Use SetObject to set both Original and resolved type, hash and size * Restore original object before using BackToOriginal (cycle resolution) * Update encoder test to check this case Signed-off-by: Javi Fontan <jfontan@gmail.com>
Diffstat (limited to 'plumbing/format/packfile/object_pack.go')
-rw-r--r--plumbing/format/packfile/object_pack.go27
1 files changed, 27 insertions, 0 deletions
diff --git a/plumbing/format/packfile/object_pack.go b/plumbing/format/packfile/object_pack.go
index 1563517..284871f 100644
--- a/plumbing/format/packfile/object_pack.go
+++ b/plumbing/format/packfile/object_pack.go
@@ -23,6 +23,12 @@ type ObjectToPack struct {
// offset in pack when object has been already written, or 0 if it
// has not been written yet
Offset int64
+
+ // Information from the original object
+ resolvedOriginal bool
+ originalType plumbing.ObjectType
+ originalSize int64
+ originalHash plumbing.Hash
}
// newObjectToPack creates a correct ObjectToPack based on a non-delta object
@@ -71,11 +77,24 @@ func (o *ObjectToPack) WantWrite() bool {
return o.Offset == 1
}
+// SetOriginal sets both Original and saves size, type and hash
+func (o *ObjectToPack) SetOriginal(obj plumbing.EncodedObject) {
+ o.Original = obj
+ o.originalSize = obj.Size()
+ o.originalType = obj.Type()
+ o.originalHash = obj.Hash()
+ o.resolvedOriginal = true
+}
+
func (o *ObjectToPack) Type() plumbing.ObjectType {
if o.Original != nil {
return o.Original.Type()
}
+ if o.resolvedOriginal {
+ return o.originalType
+ }
+
if o.Base != nil {
return o.Base.Type()
}
@@ -92,6 +111,10 @@ func (o *ObjectToPack) Hash() plumbing.Hash {
return o.Original.Hash()
}
+ if o.resolvedOriginal {
+ return o.originalHash
+ }
+
do, ok := o.Object.(plumbing.DeltaObject)
if ok {
return do.ActualHash()
@@ -105,6 +128,10 @@ func (o *ObjectToPack) Size() int64 {
return o.Original.Size()
}
+ if o.resolvedOriginal {
+ return o.originalSize
+ }
+
do, ok := o.Object.(plumbing.DeltaObject)
if ok {
return do.ActualSize()