package mega import ( "fmt" "os/exec" "path/filepath" "sort" "strings" ) const ( CP = "/usr/bin/mega-cp" FIND = "/usr/bin/mega-find" GET = "/usr/bin/mega-get" LS = "/usr/bin/mega-ls" MKDIR = "/usr/bin/mega-mkdir" MV = "/usr/bin/mega-mv" RM = "/usr/bin/mega-rm" ) type FileInfo struct { Dir string Name string FQN string } // List returns an array of mega.FileInfo restricted by specified filetype. Pass an empty // string array for all files. The array will be sorted by name based on the sortorder parameter. // Valid values are: // // "asc|desc" // // Passing an empty string will default to "asc" func List(dir string, filetypes []string, sortorder string) (files []FileInfo, err error) { out, err := exec.Command(LS, dir).Output() if err != nil { return nil, err } lines := strings.Split(string(out), "\n") for _, line := range lines { if len(filetypes) == 0 { files = append(files, FileInfo{dir, line, filepath.Join(dir, line)}) } else { for _, filetype := range filetypes { if strings.HasSuffix(line, filetype) { files = append(files, FileInfo{dir, line, filepath.Join(dir, line)}) } } } } if len(sortorder) == 0 { sortorder = "asc" } sort.Slice(files, func(i, j int) bool { iVal := strings.ToLower(files[i].Name) jVal := strings.ToLower(files[j].Name) if sortorder == "asc" { return iVal < jVal } return iVal > jVal }) return } // Backwards compatability func Files(dir string, filetypes []string, sortorder string) (files []FileInfo, err error) { return List(dir, filetypes, sortorder) } // Find returns an array of mega.FileInfo // // To specify a sort order pass either of the following: // // --sort=asc | --sort=desc // // If sort order is not specified it will default to "asc" func Find(dir string, patterns ...string) (files []FileInfo, err error) { sortorder := "asc" _params := []string{} for _, pattern := range patterns { if strings.HasPrefix(pattern, "--sort=") { _toks := strings.Split(pattern, "=") if len(_toks) == 2 && (_toks[1] == "asc" || _toks[1] == "desc") { sortorder = _toks[1] } continue } _params = append(_params, "--pattern="+pattern) } for _, param := range _params { params := []string{dir, param} fmt.Printf("cmd: %s %s\n", FIND, params) out, err := exec.Command(FIND, params...).Output() if err != nil { return nil, err } lines := strings.Split(string(out), "\n") for _, line := range lines { files = append(files, FileInfo{filepath.Dir(line), filepath.Base(line), line}) } } if len(sortorder) == 0 { sortorder = "asc" } sort.Slice(files, func(i, j int) bool { iVal := strings.ToLower(files[i].Name) jVal := strings.ToLower(files[j].Name) if sortorder == "asc" { return iVal < jVal } return iVal > jVal }) return } // Remove executes mega-rm src func Remove(src string) (err error) { _, err = exec.Command(RM, src).Output() if err != nil { return err } return } // Copy executes mega-cp src dest func Copy(src, dest string) (err error) { _, err = exec.Command(CP, src, dest).Output() if err != nil { return err } return } // Move executes mega-mv src dest func Move(src, dest string) (err error) { _, err = exec.Command(MV, src, dest).Output() if err != nil { return err } return } // Get executes mega-get src dest func Get(src, dest string) (err error) { _, err = exec.Command(GET, src, dest).Output() if err != nil { return err } return } // Mkdir executes mega-mkdir src dest func Mkdir(path string) (err error) { _, err = exec.Command(MKDIR, path).Output() if err != nil { return err } return }