diff --git a/borg/archiver.py b/borg/archiver.py index 6bcba3dd2..d3033b0d1 100644 --- a/borg/archiver.py +++ b/borg/archiver.py @@ -51,17 +51,21 @@ class Archiver: def print_error(self, msg, *args): msg = args and msg % args or msg - self.exit_code = EXIT_WARNING # we do not terminate here, so it is a warning - logger.error('borg: ' + msg) + self.exit_code = EXIT_ERROR + logger.error(msg) - def print_verbose(self, msg, *args): + def print_warning(self, msg, *args): + msg = args and msg % args or msg + self.exit_code = EXIT_WARNING # we do not terminate here, so it is a warning + logger.warning(msg) + + def print_info(self, msg, *args): if self.verbose: msg = args and msg % args or msg logger.info(msg) def print_status(self, status, path): - if self.verbose: - logger.info("%1s %s", status, remove_surrogates(path)) + self.print_info("%1s %s", status, remove_surrogates(path)) def do_serve(self, args): """Start in server mode. This command is usually not used manually. @@ -85,7 +89,7 @@ class Archiver: repository = self.open_repository(args.repository, exclusive=args.repair) if args.repair: while not os.environ.get('BORG_CHECK_I_KNOW_WHAT_I_AM_DOING'): - self.print_error("""Warning: 'check --repair' is an experimental feature that might result + self.print_warning("""'check --repair' is an experimental feature that might result in data loss. Type "Yes I am sure" if you understand this and want to continue.\n""") @@ -147,7 +151,7 @@ Type "Yes I am sure" if you understand this and want to continue.\n""") try: status = archive.process_stdin(path, cache) except IOError as e: - self.print_error('%s: %s', path, e) + self.print_warning('%s: %s', path, e) else: status = '-' self.print_status(status, path) @@ -157,7 +161,7 @@ Type "Yes I am sure" if you understand this and want to continue.\n""") try: restrict_dev = os.lstat(path).st_dev except OSError as e: - self.print_error('%s: %s', path, e) + self.print_warning('%s: %s', path, e) continue else: restrict_dev = None @@ -184,7 +188,7 @@ Type "Yes I am sure" if you understand this and want to continue.\n""") try: st = os.lstat(path) except OSError as e: - self.print_error('%s: %s', path, e) + self.print_warning('%s: %s', path, e) return if (st.st_ino, st.st_dev) in skip_inodes: return @@ -201,7 +205,7 @@ Type "Yes I am sure" if you understand this and want to continue.\n""") try: status = archive.process_file(path, st, cache) except IOError as e: - self.print_error('%s: %s', path, e) + self.print_warning('%s: %s', path, e) elif stat.S_ISDIR(st.st_mode): if exclude_caches and is_cachedir(path): return @@ -210,7 +214,7 @@ Type "Yes I am sure" if you understand this and want to continue.\n""") try: entries = os.listdir(path) except OSError as e: - self.print_error('%s: %s', path, e) + self.print_warning('%s: %s', path, e) else: for filename in sorted(entries): entry_path = os.path.normpath(os.path.join(path, filename)) @@ -230,7 +234,7 @@ Type "Yes I am sure" if you understand this and want to continue.\n""") # Ignore unix sockets return else: - self.print_error('Unknown file type: %s', path) + self.print_warning('Unknown file type: %s', path) return # Status output # A lowercase character means a file type other than a regular file, @@ -273,7 +277,7 @@ Type "Yes I am sure" if you understand this and want to continue.\n""") if not args.dry_run: while dirs and not item[b'path'].startswith(dirs[-1][b'path']): archive.extract_item(dirs.pop(-1), stdout=stdout) - self.print_verbose(remove_surrogates(orig_path)) + self.print_info(remove_surrogates(orig_path)) try: if dry_run: archive.extract_item(item, dry_run=True) @@ -284,14 +288,14 @@ Type "Yes I am sure" if you understand this and want to continue.\n""") else: archive.extract_item(item, stdout=stdout, sparse=sparse) except IOError as e: - self.print_error('%s: %s', remove_surrogates(orig_path), e) + self.print_warning('%s: %s', remove_surrogates(orig_path), e) if not args.dry_run: while dirs: archive.extract_item(dirs.pop(-1)) for pattern in (patterns or []): if isinstance(pattern, IncludePattern) and pattern.match_count == 0: - self.print_error("Warning: Include pattern '%s' never matched.", pattern) + self.print_warning("Include pattern '%s' never matched.", pattern) return self.exit_code def do_rename(self, args): @@ -343,7 +347,7 @@ Type "Yes I am sure" if you understand this and want to continue.\n""") try: from .fuse import FuseOperations except ImportError as e: - self.print_error('loading fuse support failed [ImportError: %s]' % str(e)) + self.print_error('Loading fuse support failed [ImportError: %s]' % str(e)) return self.exit_code if not os.path.isdir(args.mountpoint) or not os.access(args.mountpoint, os.R_OK | os.W_OK | os.X_OK): @@ -357,7 +361,7 @@ Type "Yes I am sure" if you understand this and want to continue.\n""") else: archive = None operations = FuseOperations(key, repository, manifest, archive) - self.print_verbose("Mounting filesystem") + self.print_info("Mounting filesystem") try: operations.mount(args.mountpoint, args.options, args.foreground) except RuntimeError: @@ -435,7 +439,7 @@ Type "Yes I am sure" if you understand this and want to continue.\n""") if args.hourly + args.daily + args.weekly + args.monthly + args.yearly == 0 and args.within is None: self.print_error('At least one of the "within", "keep-hourly", "keep-daily", "keep-weekly", ' '"keep-monthly" or "keep-yearly" settings must be specified') - return EXIT_ERROR + return self.exit_code if args.prefix: archives = [archive for archive in archives if archive.name.startswith(args.prefix)] keep = [] @@ -456,12 +460,12 @@ Type "Yes I am sure" if you understand this and want to continue.\n""") to_delete = [a for a in archives if a not in keep] stats = Statistics() for archive in keep: - self.print_verbose('Keeping archive: %s' % format_archive(archive)) + self.print_info('Keeping archive: %s' % format_archive(archive)) for archive in to_delete: if args.dry_run: - self.print_verbose('Would prune: %s' % format_archive(archive)) + self.print_info('Would prune: %s' % format_archive(archive)) else: - self.print_verbose('Pruning archive: %s' % format_archive(archive)) + self.print_info('Pruning archive: %s' % format_archive(archive)) Archive(repository, key, manifest, archive.name, cache).delete(stats) if to_delete and not args.dry_run: manifest.write()