MCPcopy
hub / github.com/basecamp/once / parseBackup

Method parseBackup

internal/docker/namespace.go:355–430  ·  view source on GitHub ↗
(r io.Reader)

Source from the content-addressed store, hash-verified

353}
354
355func (n *Namespace) parseBackup(r io.Reader) (ApplicationSettings, ApplicationVolumeSettings, []byte, error) {
356 var appSettings ApplicationSettings
357 var volSettings ApplicationVolumeSettings
358 var volumeData bytes.Buffer
359
360 gr, err := gzip.NewReader(r)
361 if err != nil {
362 return appSettings, volSettings, nil, fmt.Errorf("%w: %v", ErrInvalidBackup, err)
363 }
364 defer gr.Close()
365
366 tr := tar.NewReader(gr)
367 tw := tar.NewWriter(&volumeData)
368 defer tw.Close()
369
370 foundApp := false
371 foundVol := false
372
373 for {
374 header, err := tr.Next()
375 if errors.Is(err, io.EOF) {
376 break
377 }
378 if err != nil {
379 return appSettings, volSettings, nil, fmt.Errorf("%w: %v", ErrInvalidBackup, err)
380 }
381
382 switch header.Name {
383 case backupAppSettingsEntry:
384 data, err := io.ReadAll(tr)
385 if err != nil {
386 return appSettings, volSettings, nil, fmt.Errorf("%w: reading application settings: %v", ErrInvalidBackup, err)
387 }
388 appSettings, err = UnmarshalApplicationSettings(string(data))
389 if err != nil {
390 return appSettings, volSettings, nil, fmt.Errorf("%w: parsing application settings: %v", ErrInvalidBackup, err)
391 }
392 foundApp = true
393
394 case backupVolSettingsEntry:
395 data, err := io.ReadAll(tr)
396 if err != nil {
397 return appSettings, volSettings, nil, fmt.Errorf("%w: reading volume settings: %v", ErrInvalidBackup, err)
398 }
399 volSettings, err = UnmarshalApplicationVolumeSettings(string(data))
400 if err != nil {
401 return appSettings, volSettings, nil, fmt.Errorf("%w: parsing volume settings: %v", ErrInvalidBackup, err)
402 }
403 foundVol = true
404
405 default:
406 if header.Name == BackupDataDir || strings.HasPrefix(header.Name, BackupDataDir+"/") {
407 newHeader := *header
408 if header.Name == BackupDataDir {
409 newHeader.Name = "data"
410 } else {
411 newHeader.Name = "data" + strings.TrimPrefix(header.Name, BackupDataDir)
412 }

Callers 2

RestoreMethod · 0.95

Calls 5

NextMethod · 0.80
WriteHeaderMethod · 0.80
CloseMethod · 0.45

Tested by 1