code: func (a *Archiver) RunOnce(ctx context.Context) error {
  	if a.Source == nil {
  		return errors.New("archiver: nil Source")
  	}
  	if a.Store == nil {
  		return errors.New("archiver: nil Store func")
  	}
  	pz := &potentialZip{a: a}
  	err := blobserver.EnumerateAll(ctx, a.Source, func(sb blob.SizedRef) error {
  		if err := pz.addBlob(ctx, sb); err != nil {
  			return err
  		}
  		if pz.bigEnough() {
  			return errStopEnumerate
  		}
  		return nil
  	})
  	if err == errStopEnumerate {
  		err = nil
  	}
  	if err != nil {
  		return err
  	}
  	if err := pz.condClose(); err != nil {
  		return err
  	}
  	if !pz.bigEnough() {
  		return ErrSourceTooSmall
  	}
  	if err := a.Store(pz.buf.Bytes(), pz.blobs); err != nil {
  		return err
  	}
  	if a.DeleteSourceAfterStore {
  		blobs := make([]blob.Ref, 0, len(pz.blobs))
  		for _, sb := range pz.blobs {
  			blobs = append(blobs, sb.Ref)
  		}
  		if err := a.Source.RemoveBlobs(ctx, blobs); err != nil {
  			return err
  		}
  	}
  	return nil
  }
docs: // RunOnce scans a.Source and conditionally creates a new zip.
  // It returns ErrSourceTooSmall if there aren't enough blobs on Source.