func (command RepairCommand) repairModified(store *storage.Storage, modified fileIdAndInfoMap) error { if command.verbose { log.Info("repairing modified files") } for path, fileIdAndStat := range modified { fileId := fileIdAndStat.fileId stat := fileIdAndStat.stat log.Infof("%v: modified", path) fingerprint, err := fingerprint.Create(path) if err != nil { return fmt.Errorf("%v: could not create fingerprint: %v", path, err) } if !command.pretend { _, err := store.UpdateFile(fileId, path, fingerprint, stat.ModTime(), stat.Size(), stat.IsDir()) if err != nil { return fmt.Errorf("%v: could not update file in database: %v", path, err) } } } return nil }
func (command DupesCommand) findDuplicatesOf(paths []string) error { store, err := storage.Open() if err != nil { return fmt.Errorf("could not open storage: %v", err) } defer store.Close() first := true for _, path := range paths { if command.verbose { log.Infof("%v: identifying duplicate files.\n", path) } fp, err := fingerprint.Create(path) if err != nil { return fmt.Errorf("%v: could not create fingerprint: %v", path, err) } if fp == fingerprint.Fingerprint("") { return nil } files, err := store.FilesByFingerprint(fp) if err != nil { return fmt.Errorf("%v: could not retrieve files matching fingerprint '%v': %v", path, fp, err) } absPath, err := filepath.Abs(path) if err != nil { return fmt.Errorf("%v: could not determine absolute path: %v", path, err) } // filter out the file we're searching on dupes := files.Where(func(file *database.File) bool { return file.Path() != absPath }) if len(paths) > 1 && len(dupes) > 0 { if first { first = false } else { log.Print() } log.Printf("%v duplicates of %v:", len(dupes), path) for _, dupe := range dupes { relPath := _path.Rel(dupe.Path()) log.Printf(" %v", relPath) } } else { for _, dupe := range dupes { relPath := _path.Rel(dupe.Path()) log.Print(relPath) } } } return nil }
func (command *TagCommand) addFile(store *storage.Storage, path string, modTime time.Time, size uint, isDir bool) (*database.File, error) { if command.verbose { log.Infof("%v: adding file.", path) } fingerprint, err := fingerprint.Create(path) if err != nil { return nil, fmt.Errorf("%v: could not create fingerprint: %v", path, err) } file, err := store.AddFile(path, fingerprint, modTime, int64(size), isDir) if err != nil { return nil, fmt.Errorf("%v: could not add file to database: %v", path, err) } return file, nil }
func (command RepairCommand) repairMoved(store *storage.Storage, missing databaseFileMap, untagged fileInfoMap) error { if command.verbose { log.Info("repairing moved files") } moved := make([]string, 0, 10) for path, dbFile := range missing { if command.verbose { log.Infof("%v: searching for new location", path) } for candidatePath, stat := range untagged { if stat.Size() == dbFile.Size { fingerprint, err := fingerprint.Create(candidatePath) if err != nil { return fmt.Errorf("%v: could not create fingerprint: %v", path, err) } if fingerprint == dbFile.Fingerprint { log.Infof("%v: moved to %v", path, candidatePath) moved = append(moved, path) if !command.pretend { _, err := store.UpdateFile(dbFile.Id, candidatePath, dbFile.Fingerprint, stat.ModTime(), dbFile.Size, dbFile.IsDir) if err != nil { return fmt.Errorf("%v: could not update file in database: %v", path, err) } } delete(untagged, candidatePath) break } } } } for _, path := range moved { delete(missing, path) } return nil }