(p string)
| 612 | } |
| 613 | |
| 614 | func validatePath(p string) (string, bool, error) { |
| 615 | /** Check order of: |
| 616 | * Root folder (is it empty, or an FP folder) |
| 617 | * Flashpoint child folder |
| 618 | */ |
| 619 | |
| 620 | Resumable := func(p string) bool { |
| 621 | sqlitePath := filepath.Join(p, "ultimate.sqlite") |
| 622 | _, err := os.Stat(sqlitePath) |
| 623 | if os.IsNotExist(err) { |
| 624 | // File does not exist |
| 625 | return false |
| 626 | } |
| 627 | if err != nil { |
| 628 | panic(err) |
| 629 | } |
| 630 | return true |
| 631 | } |
| 632 | |
| 633 | CheckPath := func(p string) (bool, bool) { |
| 634 | _, err := os.Stat(p) |
| 635 | if os.IsNotExist(err) { |
| 636 | // Folder does not exist |
| 637 | return true, false |
| 638 | } |
| 639 | |
| 640 | f, err := os.Open(p) |
| 641 | if err != nil { |
| 642 | // Exists, but cannot open (permissions?) |
| 643 | return false, false |
| 644 | } |
| 645 | defer f.Close() |
| 646 | |
| 647 | _, err = f.Readdirnames(1) // Read just one entry |
| 648 | if err != nil { |
| 649 | // Directory empty |
| 650 | return true, false |
| 651 | } |
| 652 | |
| 653 | // If has a resumable file, assume a valid folder without checking others |
| 654 | resumable := Resumable(p) |
| 655 | if resumable { |
| 656 | return true, true |
| 657 | } |
| 658 | |
| 659 | // Check if existing FP folder |
| 660 | folders := []string{"Data", "FPSoftware", "Launcher"} |
| 661 | for _, folder := range folders { |
| 662 | folderPath := filepath.Join(p, folder) |
| 663 | if _, err := os.Stat(folderPath); os.IsNotExist(err) { |
| 664 | return false, false |
| 665 | } |
| 666 | } |
| 667 | return true, resumable |
| 668 | } |
| 669 | |
| 670 | available, resumable := CheckPath(p) |
| 671 | if available { |
no test coverage detected