From baa77c0e0483a6e09035462dcfaee4bde2a90d06 Mon Sep 17 00:00:00 2001 From: Thomas Waldmann Date: Tue, 18 Oct 2016 21:36:23 +0200 Subject: [PATCH] avoid previous_location mismatch, fixes #1741 due to the changed canonicalization for relative pathes in PR #1711 (implement /./ relpath hack), there would be a changed repo location warning and the user would be asked if this is ok. this would break automation and require manual intervention, which is unwanted. thus, we automatically fix the previous_location config entry, if it only changed in the expected way, but still means the same location. --- borg/cache.py | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/borg/cache.py b/borg/cache.py index 43ef5c94b..53fdae7ca 100644 --- a/borg/cache.py +++ b/borg/cache.py @@ -10,7 +10,7 @@ from .key import PlaintextKey from .logger import create_logger logger = create_logger() from .helpers import Error, get_cache_dir, decode_dict, int_to_bigint, \ - bigint_to_int, format_file_size, yes, bin_to_hex + bigint_to_int, format_file_size, yes, bin_to_hex, Location from .locking import Lock from .hashindex import ChunkIndex @@ -140,10 +140,7 @@ Chunk index: {0.total_unique_chunks:20d} {0.total_chunks:20d}""" with open(os.path.join(self.path, 'files'), 'wb') as fd: pass # empty file - def _do_open(self): - self.config = configparser.ConfigParser(interpolation=None) - config_path = os.path.join(self.path, 'config') - self.config.read(config_path) + def _check_upgrade(self, config_path): try: cache_version = self.config.getint('cache', 'version') wanted_version = 1 @@ -154,6 +151,25 @@ Chunk index: {0.total_unique_chunks:20d} {0.total_chunks:20d}""" except configparser.NoSectionError: self.close() raise Exception('%s does not look like a Borg cache.' % config_path) from None + # borg < 1.0.8rc1 had different canonicalization for the repo location (see #1655 and #1741). + cache_loc = self.config.get('cache', 'previous_location', fallback=None) + if cache_loc: + repo_loc = self.repository._location.canonical_path() + rl = Location(repo_loc) + cl = Location(cache_loc) + if cl.proto == rl.proto and cl.user == rl.user and cl.host == rl.host and cl.port == rl.port \ + and \ + cl.path and rl.path and \ + cl.path.startswith('/~/') and rl.path.startswith('/./') and cl.path[3:] == rl.path[3:]: + # everything is same except the expected change in relative path canonicalization, + # update previous_location to avoid warning / user query about changed location: + self.config.set('cache', 'previous_location', repo_loc) + + def _do_open(self): + self.config = configparser.ConfigParser(interpolation=None) + config_path = os.path.join(self.path, 'config') + self.config.read(config_path) + self._check_upgrade(config_path) self.id = self.config.get('cache', 'repository') self.manifest_id = unhexlify(self.config.get('cache', 'manifest')) self.timestamp = self.config.get('cache', 'timestamp', fallback=None)