func (command *FilesCommand) listFiles(files database.Files) error { tree := path.NewTree() for _, file := range files { tree.Add(file.Path(), file.IsDir) } if command.top { tree = tree.TopLevel() } else { if command.recursive { fsFiles, err := command.filesystemFiles(tree.TopLevel().Paths()) if err != nil { return err } for _, fsFile := range fsFiles { tree.Add(fsFile.path, fsFile.isDir) } } } if command.leaf { tree = tree.Leaves() } if command.file { tree = tree.Files() } if command.directory { tree = tree.Directories() } if command.count { log.Print(len(tree.Paths())) } else { for _, absPath := range tree.Paths() { relPath := path.Rel(absPath) if command.print0 { log.Print0(relPath) } else { log.Print(relPath) } } } return nil }
func (command StatusCommand) statusDatabase() (*StatusReport, error) { report := NewReport() store, err := storage.Open() if err != nil { return nil, fmt.Errorf("could not open storage: %v", err) } defer store.Close() if command.verbose { log.Info("retrieving all files from database.") } files, err := store.Files() if err != nil { return nil, fmt.Errorf("could not retrieve files: %v", err) } err = command.checkFiles(files, report) if err != nil { return nil, err } tree := path.NewTree() for _, file := range files { tree.Add(file.Path(), file.IsDir) } topLevelPaths := tree.TopLevel().Paths() if err != nil { return nil, err } for _, path := range topLevelPaths { if err = command.findNewFiles(path, report); err != nil { return nil, err } } return report, nil }
func (command RepairCommand) checkFiles(store *storage.Storage, paths []string) error { tree := _path.NewTree() for _, path := range paths { tree.Add(path, false) } paths = tree.TopLevel().Paths() fsPaths, err := enumerateFileSystemPaths(paths) if err != nil { return err } dbPaths, err := enumerateDatabasePaths(store, paths) if err != nil { return err } _, untagged, modified, missing := command.determineStatuses(fsPaths, dbPaths) if err = command.repairModified(store, modified); err != nil { return err } if err = command.repairMoved(store, missing, untagged); err != nil { return err } if err = command.repairMissing(store, missing); err != nil { return err } for path, _ := range untagged { log.Infof("%v: untagged", path) } //TODO cleanup: any files that have no tags: remove //TODO cleanup: any tags that do not correspond to a file: remove return nil }