(recoverCtx *composeRecoverContext)
| 621 | } |
| 622 | |
| 623 | func stepRestoreComposeFiles(recoverCtx *composeRecoverContext) error { |
| 624 | if recoverCtx.targetDir != "" { |
| 625 | _ = os.RemoveAll(recoverCtx.targetDir) |
| 626 | } |
| 627 | if err := os.MkdirAll(recoverCtx.targetDir, os.ModePerm); err != nil { |
| 628 | return err |
| 629 | } |
| 630 | restored := make([]string, 0, len(recoverCtx.meta.Files)) |
| 631 | for _, item := range recoverCtx.meta.Files { |
| 632 | backupPath, err := safeJoinWithinBase(recoverCtx.tmpDir, item.BackupPath) |
| 633 | if err != nil { |
| 634 | return fmt.Errorf("invalid compose backup path %q, err: %v", item.BackupPath, err) |
| 635 | } |
| 636 | if !recoverCtx.fileOp.Stat(backupPath) { |
| 637 | continue |
| 638 | } |
| 639 | targetName := item.FileName |
| 640 | if item.RelativePath != "" { |
| 641 | targetName = item.RelativePath |
| 642 | } |
| 643 | if targetName == "" { |
| 644 | targetName = path.Base(item.OriginalPath) |
| 645 | } |
| 646 | if targetName == "" { |
| 647 | targetName = "docker-compose.yml" |
| 648 | } |
| 649 | targetPath, err := safeJoinWithinBase(recoverCtx.targetDir, targetName) |
| 650 | if err != nil { |
| 651 | return fmt.Errorf("invalid compose target path %q, err: %v", targetName, err) |
| 652 | } |
| 653 | if err := os.MkdirAll(path.Dir(targetPath), os.ModePerm); err != nil { |
| 654 | return err |
| 655 | } |
| 656 | content, err := os.ReadFile(backupPath) |
| 657 | if err != nil { |
| 658 | return err |
| 659 | } |
| 660 | if err := recoverCtx.fileOp.SaveFile(targetPath, string(content), fs.ModePerm); err != nil { |
| 661 | return err |
| 662 | } |
| 663 | restored = append(restored, targetPath) |
| 664 | } |
| 665 | envPath := path.Join(recoverCtx.tmpDir, "compose_files", ".env") |
| 666 | if recoverCtx.fileOp.Stat(envPath) { |
| 667 | envContent, err := os.ReadFile(envPath) |
| 668 | if err != nil { |
| 669 | return err |
| 670 | } |
| 671 | if err := recoverCtx.fileOp.SaveFile(path.Join(recoverCtx.targetDir, ".env"), string(envContent), fs.ModePerm); err != nil { |
| 672 | return err |
| 673 | } |
| 674 | } |
| 675 | if len(restored) == 0 { |
| 676 | defaultPath := path.Join(recoverCtx.targetDir, "docker-compose.yml") |
| 677 | if !recoverCtx.fileOp.Stat(defaultPath) { |
| 678 | return fmt.Errorf("compose file not found in backup data") |
| 679 | } |
| 680 | restored = append(restored, defaultPath) |
no test coverage detected