in manifest.go [1265:1323]
func (m *ManifestListWriter) AddManifests(files []ManifestFile) error {
if len(files) == 0 {
return nil
}
switch m.version {
case 1:
if slices.ContainsFunc(files, func(f ManifestFile) bool {
return f.Version() != 1
}) {
return fmt.Errorf("%w: ManifestListWriter only supports version 1 manifest files", ErrInvalidArgument)
}
var tmp manifestFileV1
for _, file := range files {
file.(*manifestFile).toV1(&tmp)
if err := m.writer.Encode(&tmp); err != nil {
return err
}
}
case 2:
for _, file := range files {
if file.Version() != 2 {
return fmt.Errorf("%w: ManifestListWriter only supports version 2 manifest files", ErrInvalidArgument)
}
wrapped := *(file.(*manifestFile))
if wrapped.SeqNumber == -1 {
// if the sequence number is being assigned here,
// then the manifest must be created by the current
// operation.
// to validate this, check the snapshot id matches the current commmit
if m.commitSnapshotID != wrapped.AddedSnapshotID {
return fmt.Errorf("found unassigned sequence number for a manifest from snapshot %d != %d",
m.commitSnapshotID, wrapped.AddedSnapshotID)
}
wrapped.SeqNumber = m.sequenceNumber
}
if wrapped.MinSeqNumber == -1 {
if m.commitSnapshotID != wrapped.AddedSnapshotID {
return fmt.Errorf("found unassigned sequence number for a manifest from snapshot: %d", wrapped.AddedSnapshotID)
}
// if the min sequence number is not determined, then there was no assigned sequence number
// for any file written to the wrapped manifest. replace the unassigned sequence number with
// the one for this commit
wrapped.MinSeqNumber = m.sequenceNumber
}
if err := m.writer.Encode(wrapped); err != nil {
return err
}
}
default:
return fmt.Errorf("unsupported manifest version: %d", m.version)
}
return nil
}