func listFiles(files entities.Files, dirOnly, fileOnly, topOnly, leafOnly, recursive, print0, showCount, onePerLine bool) error { tree := path.NewTree() for _, file := range files { tree.Add(file.Path(), file.IsDir) } if topOnly { tree = tree.TopLevel() } else { if recursive { fsFiles, err := path.Enumerate(tree.TopLevel().Paths()) if err != nil { return err } for _, fsFile := range fsFiles { tree.Add(fsFile.Path, fsFile.IsDir) } } } if leafOnly { tree = tree.Leaves() } if fileOnly { tree = tree.Files() } if dirOnly { tree = tree.Directories() } absPaths := tree.Paths() if showCount { fmt.Println(len(absPaths)) } else { relPaths := make([]string, len(absPaths)) for index, absPath := range absPaths { relPaths[index] = path.Rel(absPath) } sort.Strings(relPaths) if onePerLine || print0 { for _, relPath := range relPaths { if print0 { fmt.Printf("%v\000", relPath) } else { fmt.Println(relPath) } } } else { format.Columns(relPaths, terminalWidth()) } } return nil }
func repairFiles(store *storage.Storage, paths []string, pretend, force bool, fingerprintAlgorithm 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 := determineStatuses(fsPaths, dbPaths) if err = repairModified(store, modified, pretend, fingerprintAlgorithm); err != nil { return err } if err = repairMoved(store, missing, untagged, pretend, fingerprintAlgorithm); err != nil { return err } if err = repairMissing(store, missing, pretend, force); err != nil { return err } for path, _ := range untagged { log.Infof(1, "%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 }
func statusDatabase(dirOnly bool) (*StatusReport, error) { report := NewReport() store, err := storage.Open() if err != nil { return nil, fmt.Errorf("could not open storage: %v", err) } defer store.Close() log.Info(2, "retrieving all files from database.") files, err := store.Files() if err != nil { return nil, fmt.Errorf("could not retrieve files: %v", err) } err = statusCheckFiles(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 = findNewFiles(path, report, dirOnly); err != nil { return nil, err } } return report, nil }