(o *ObjectToPack)
| 82 | } |
| 83 | |
| 84 | func (e *Encoder) entry(o *ObjectToPack) (err error) { |
| 85 | if o.WantWrite() { |
| 86 | // A cycle exists in this delta chain. This should only occur if a |
| 87 | // selected object representation disappeared during writing |
| 88 | // (for example due to a concurrent repack) and a different base |
| 89 | // was chosen, forcing a cycle. Select something other than a |
| 90 | // delta, and write this object. |
| 91 | e.selector.restoreOriginal(o) |
| 92 | o.BackToOriginal() |
| 93 | } |
| 94 | |
| 95 | if o.IsWritten() { |
| 96 | return nil |
| 97 | } |
| 98 | |
| 99 | o.MarkWantWrite() |
| 100 | |
| 101 | if err := e.writeBaseIfDelta(o); err != nil { |
| 102 | return err |
| 103 | } |
| 104 | |
| 105 | // We need to check if we already write that object due a cyclic delta chain |
| 106 | if o.IsWritten() { |
| 107 | return nil |
| 108 | } |
| 109 | |
| 110 | o.Offset = e.w.Offset() |
| 111 | |
| 112 | if o.IsDelta() { |
| 113 | if err := e.writeDeltaHeader(o); err != nil { |
| 114 | return err |
| 115 | } |
| 116 | } else { |
| 117 | if err := e.entryHead(o.Type(), o.Size()); err != nil { |
| 118 | return err |
| 119 | } |
| 120 | } |
| 121 | |
| 122 | e.zw.Reset(e.w) |
| 123 | |
| 124 | defer ioutil.CheckClose(e.zw, &err) |
| 125 | |
| 126 | or, err := o.Object.Reader() |
| 127 | if err != nil { |
| 128 | return err |
| 129 | } |
| 130 | |
| 131 | defer ioutil.CheckClose(or, &err) |
| 132 | |
| 133 | _, err = io.Copy(e.zw, or) |
| 134 | return err |
| 135 | } |
| 136 | |
| 137 | func (e *Encoder) writeBaseIfDelta(o *ObjectToPack) error { |
| 138 | if o.IsDelta() && !o.Base.IsWritten() { |
no test coverage detected