MCPcopy Index your code
hub / github.com/git-bug/git-bug / readOperationPack

Function readOperationPack

entity/dag/operation_pack.go:208–293  ·  view source on GitHub ↗

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)

Source from the content-addressed store, hash-verified

206//
207// Validity of the Lamport clocks is left for the caller to decide.
208func 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")

Callers 4

TestOperationPackFilesFunction · 0.85
readFunction · 0.85

Calls 11

ValidKeysAtTimeMethod · 0.95
NewErrUnknownFormatFunction · 0.92
NewErrInvalidFormatFunction · 0.92
DeriveIdFunction · 0.92
TimeTypeAlias · 0.92
unmarshallPackFunction · 0.85
ErrorfMethod · 0.80
PGPEntityMethod · 0.80
ReadTreeMethod · 0.65
ReadDataMethod · 0.65
HasPrefixMethod · 0.45

Tested by 3

TestOperationPackFilesFunction · 0.68