| 111 | } |
| 112 | |
| 113 | func DecodeObject(r io.Reader) (*Object, error) { |
| 114 | o := &Object{} |
| 115 | reader := bsupbytes.NewDeserializer(r, ActionTypes) |
| 116 | defer reader.Close() |
| 117 | for { |
| 118 | entry, err := reader.Read() |
| 119 | if err != nil { |
| 120 | return nil, err |
| 121 | } |
| 122 | if entry == nil { |
| 123 | break |
| 124 | } |
| 125 | action, ok := entry.(Action) |
| 126 | if !ok { |
| 127 | return nil, badObject(entry) |
| 128 | } |
| 129 | o.append(action) |
| 130 | } |
| 131 | // Fill in the commit and parent IDs from the first record, |
| 132 | // which must always be a Commit action. |
| 133 | if len(o.Actions) > 0 { |
| 134 | first, ok := o.Actions[0].(*Commit) |
| 135 | if !ok { |
| 136 | return nil, ErrBadCommitObject |
| 137 | } |
| 138 | o.Commit = first.ID |
| 139 | o.Parent = first.Parent |
| 140 | } |
| 141 | return o, nil |
| 142 | } |
| 143 | |
| 144 | func badObject(entry any) error { |
| 145 | return fmt.Errorf("internal error: corrupt commit object has unknown entry type %T", entry) |