From 37aad2e3aab366c9fda2f534fd003296e9be6e78 Mon Sep 17 00:00:00 2001 From: Johannes Kohnen Date: Tue, 1 Aug 2017 17:20:09 +0000 Subject: [PATCH] Close exclude files and check errors --- cmd/restic/cmd_backup.go | 68 +++++++++++++++++++++++++--------------- 1 file changed, 43 insertions(+), 25 deletions(-) diff --git a/cmd/restic/cmd_backup.go b/cmd/restic/cmd_backup.go index edc36f2df..8a8e47b08 100644 --- a/cmd/restic/cmd_backup.go +++ b/cmd/restic/cmd_backup.go @@ -408,31 +408,7 @@ func runBackup(opts BackupOptions, gopts GlobalOptions, args []string) error { // add patterns from file if len(opts.ExcludeFiles) > 0 { - for _, filename := range opts.ExcludeFiles { - file, err := fs.Open(filename) - if err != nil { - Warnf("error reading exclude patterns: %v", err) - return nil - } - - scanner := bufio.NewScanner(file) - for scanner.Scan() { - line := strings.TrimSpace(scanner.Text()) - - // ignore empty lines - if line == "" { - continue - } - - // strip comments - if strings.HasPrefix(line, "#") { - continue - } - - line = os.ExpandEnv(line) - opts.Excludes = append(opts.Excludes, line) - } - } + opts.Excludes = append(opts.Excludes, readExcludePatternsFromFiles(opts.ExcludeFiles)...) } selectFilter := func(item string, fi os.FileInfo) bool { @@ -499,3 +475,45 @@ func runBackup(opts BackupOptions, gopts GlobalOptions, args []string) error { return nil } + +func readExcludePatternsFromFiles(excludeFiles []string) []string { + var excludes []string + for _, filename := range excludeFiles { + err := func() (err error) { + file, err := fs.Open(filename) + if err != nil { + return err + } + defer func() { + // return pre-close error if there was one + if errClose := file.Close(); err == nil { + err = errClose + } + }() + + scanner := bufio.NewScanner(file) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + + // ignore empty lines + if line == "" { + continue + } + + // strip comments + if strings.HasPrefix(line, "#") { + continue + } + + line = os.ExpandEnv(line) + excludes = append(excludes, line) + } + return scanner.Err() + }() + if err != nil { + Warnf("error reading exclude patterns: %v:", err) + return nil + } + } + return excludes +}