(c request.FileDeCompress)
| 501 | } |
| 502 | |
| 503 | func (f *FileService) DeCompress(c request.FileDeCompress) error { |
| 504 | fo := files.NewFileOp() |
| 505 | if c.Type == "tar" && len(c.Secret) != 0 { |
| 506 | c.Type = "tar.gz" |
| 507 | } |
| 508 | if err := preflightDecompressTool(files.CompressType(c.Type)); err != nil { |
| 509 | return err |
| 510 | } |
| 511 | taskItem, err := task.NewTask(c.Path, task.TaskExec, task.TaskScopeTask, c.TaskID, 1) |
| 512 | if err != nil { |
| 513 | return err |
| 514 | } |
| 515 | go func() { |
| 516 | taskItem.AddSubTask(c.Path, func(t *task.Task) error { |
| 517 | t.LogStart(c.Path) |
| 518 | dstExisted := fo.Stat(c.Dst) |
| 519 | parentDir := filepath.Dir(c.Dst) |
| 520 | if !fo.Stat(parentDir) { |
| 521 | if err := fo.CreateDir(parentDir, constant.DirPerm); err != nil { |
| 522 | return err |
| 523 | } |
| 524 | } |
| 525 | tempDst, err := os.MkdirTemp(parentDir, ".decompress-*") |
| 526 | if err != nil { |
| 527 | return err |
| 528 | } |
| 529 | success := false |
| 530 | defer func() { |
| 531 | _ = os.RemoveAll(tempDst) |
| 532 | if !success && !dstExisted { |
| 533 | _ = os.RemoveAll(c.Dst) |
| 534 | } |
| 535 | }() |
| 536 | if err := fo.Decompress(t.TaskCtx, c.Path, tempDst, files.CompressType(c.Type), c.Secret); err != nil { |
| 537 | return err |
| 538 | } |
| 539 | if err := fo.CreateDir(c.Dst, constant.DirPerm); err != nil { |
| 540 | return err |
| 541 | } |
| 542 | if err := copyDecompressTree(t.TaskCtx, tempDst, c.Dst); err != nil { |
| 543 | return err |
| 544 | } |
| 545 | success = true |
| 546 | return nil |
| 547 | }, nil) |
| 548 | _ = taskItem.Execute() |
| 549 | }() |
| 550 | return nil |
| 551 | } |
| 552 | |
| 553 | func copyDecompressTree(ctx context.Context, srcDir, dstDir string) error { |
| 554 | entries, err := os.ReadDir(srcDir) |
nothing calls this directly
no test coverage detected