func (command TagsCommand) listTagsForPath(store *storage.Storage, path string) error { if command.verbose { log.Infof("%v: retrieving tags.", path) } var tags, err = store.TagsForPath(path) if err != nil { return fmt.Errorf("%v: could not retrieve tags: %v", path, err) } if len(tags) == 0 { _, err := os.Stat(path) if err != nil { switch { case os.IsPermission(err): log.Warnf("%v: permission denied", path) case os.IsNotExist(err): return fmt.Errorf("%v: file not found", path) default: return fmt.Errorf("%v: could not stat file: %v", path, err) } } } if command.count { log.Print(len(tags)) } else { for _, tag := range tags { log.Print(tag.Name) } } return nil }
func (command *StatusCommand) findNewFiles(searchPath string, report *StatusReport) error { if command.verbose { log.Infof("%v: finding new files.", searchPath) } relPath := path.Rel(searchPath) if !report.ContainsRow(relPath) { report.AddRow(Row{relPath, UNTAGGED}) } absPath, err := filepath.Abs(searchPath) if err != nil { return fmt.Errorf("%v: could not get absolute path: %v", searchPath, err) } stat, err := os.Stat(absPath) if err != nil { switch { case os.IsNotExist(err): return nil case os.IsPermission(err): log.Warnf("%v: permission denied.", searchPath) return nil default: return fmt.Errorf("%v: could not stat: %v", searchPath, err) } } if !command.directory && stat.IsDir() { dir, err := os.Open(absPath) if err != nil { return fmt.Errorf("%v: could not open file: %v", searchPath, err) } dirNames, err := dir.Readdirnames(0) if err != nil { return fmt.Errorf("%v: could not read directory listing: %v", searchPath, err) } for _, dirName := range dirNames { dirPath := filepath.Join(searchPath, dirName) err = command.findNewFiles(dirPath, report) if err != nil { return err } } } return nil }
func (command *StatusCommand) checkFile(file *database.File, report *StatusReport) error { relPath := path.Rel(file.Path()) if command.verbose { log.Infof("%v: checking file status.", file.Path()) } stat, err := os.Stat(file.Path()) if err != nil { switch { case os.IsNotExist(err): if command.verbose { log.Infof("%v: file is missing.", file.Path()) } report.AddRow(Row{relPath, MISSING}) return nil case os.IsPermission(err): log.Warnf("%v: permission denied.", file.Path()) case strings.Contains(err.Error(), "not a directory"): report.AddRow(Row{relPath, MISSING}) return nil default: return fmt.Errorf("%v: could not stat: %v", file.Path(), err) } } else { if stat.Size() != file.Size || stat.ModTime().UTC() != file.ModTime { if command.verbose { log.Infof("%v: file is modified.", file.Path()) } report.AddRow(Row{relPath, MODIFIED}) } else { if command.verbose { log.Infof("%v: file is unchanged.", file.Path()) } report.AddRow(Row{relPath, TAGGED}) } } return nil }
func (command *FilesCommand) filesystemFilesRecursive(path string, files []fileSystemFile) ([]fileSystemFile, error) { stat, err := os.Stat(path) if err != nil { switch { case os.IsNotExist(err): return files, nil case os.IsPermission(err): log.Warnf("%v: permission denied", path) return files, nil default: return nil, fmt.Errorf("%v: could not stat: %v", path, err) } } files = append(files, fileSystemFile{path, stat.IsDir()}) if stat.IsDir() { dir, err := os.Open(path) if err != nil { return nil, fmt.Errorf("%v: could not open directory: %v", path, err) } names, err := dir.Readdirnames(0) dir.Close() if err != nil { return nil, fmt.Errorf("%v: could not read directory entries: %v", path, err) } for _, name := range names { childPath := filepath.Join(path, name) files, err = command.filesystemFilesRecursive(childPath, files) if err != nil { return nil, err } } } return files, nil }
func enumerateFileSystemPath(files fileInfoMap, path string) error { stat, err := os.Stat(path) if err != nil { switch { case os.IsPermission(err): log.Warnf("%v: permission denied", path) return nil case os.IsNotExist(err): return nil default: return fmt.Errorf("%v: could not stat file: %v", path, err) } } files[path] = stat if stat.IsDir() { file, err := os.Open(path) if err != nil { return fmt.Errorf("%v: could not open file: %v", path, err) } childFilenames, err := file.Readdirnames(0) file.Close() if err != nil { return fmt.Errorf("%v: could not read directory: %v", file.Name(), err) } for _, childFilename := range childFilenames { childPath := filepath.Join(path, childFilename) enumerateFileSystemPath(files, childPath) } } return nil }