readOperationPack read the operationPack encoded in git at the given Tree hash. Validity of the Lamport clocks is left for the caller to decide.
(def Definition, repo repository.RepoData, resolvers entity.Resolvers, commit repository.Commit)
| 206 | // |
| 207 | // Validity of the Lamport clocks is left for the caller to decide. |
| 208 | func readOperationPack(def Definition, repo repository.RepoData, resolvers entity.Resolvers, commit repository.Commit) (*operationPack, error) { |
| 209 | entries, err := repo.ReadTree(commit.TreeHash) |
| 210 | if err != nil { |
| 211 | return nil, err |
| 212 | } |
| 213 | |
| 214 | // check the format version first, fail early instead of trying to read something |
| 215 | var version uint |
| 216 | for _, entry := range entries { |
| 217 | if strings.HasPrefix(entry.Name, versionEntryPrefix) { |
| 218 | v, err := strconv.ParseUint(strings.TrimPrefix(entry.Name, versionEntryPrefix), 10, 64) |
| 219 | if err != nil { |
| 220 | return nil, errors.Wrap(err, "can't read format version") |
| 221 | } |
| 222 | if v > 1<<12 { |
| 223 | return nil, fmt.Errorf("format version too big") |
| 224 | } |
| 225 | version = uint(v) |
| 226 | break |
| 227 | } |
| 228 | } |
| 229 | if version == 0 { |
| 230 | return nil, entity.NewErrUnknownFormat(def.FormatVersion) |
| 231 | } |
| 232 | if version != def.FormatVersion { |
| 233 | return nil, entity.NewErrInvalidFormat(version, def.FormatVersion) |
| 234 | } |
| 235 | |
| 236 | var id entity.Id |
| 237 | var author identity.Interface |
| 238 | var ops []Operation |
| 239 | var createTime lamport.Time |
| 240 | var editTime lamport.Time |
| 241 | |
| 242 | for _, entry := range entries { |
| 243 | switch { |
| 244 | case entry.Name == opsEntryName: |
| 245 | data, err := repo.ReadData(entry.Hash) |
| 246 | if err != nil { |
| 247 | return nil, errors.Wrap(err, "failed to read git blob data") |
| 248 | } |
| 249 | ops, author, err = unmarshallPack(def, resolvers, data) |
| 250 | if err != nil { |
| 251 | return nil, err |
| 252 | } |
| 253 | id = entity.DeriveId(data) |
| 254 | |
| 255 | case strings.HasPrefix(entry.Name, createClockEntryPrefix): |
| 256 | v, err := strconv.ParseUint(strings.TrimPrefix(entry.Name, createClockEntryPrefix), 10, 64) |
| 257 | if err != nil { |
| 258 | return nil, errors.Wrap(err, "can't read creation lamport time") |
| 259 | } |
| 260 | createTime = lamport.Time(v) |
| 261 | |
| 262 | case strings.HasPrefix(entry.Name, editClockEntryPrefix): |
| 263 | v, err := strconv.ParseUint(strings.TrimPrefix(entry.Name, editClockEntryPrefix), 10, 64) |
| 264 | if err != nil { |
| 265 | return nil, errors.Wrap(err, "can't read edit lamport time") |