Fix bug in sync if href changes

This commit is contained in:
Markus Unterwaditzer 2016-02-16 22:59:07 +01:00
parent 3d856749f3
commit f2a0d07c09
2 changed files with 17 additions and 3 deletions

View file

@ -2,6 +2,8 @@
import pytest import pytest
from copy import deepcopy
import vdirsyncer.exceptions as exceptions import vdirsyncer.exceptions as exceptions
from vdirsyncer.storage.base import Item from vdirsyncer.storage.base import Item
from vdirsyncer.storage.memory import MemoryStorage from vdirsyncer.storage.memory import MemoryStorage
@ -336,12 +338,19 @@ def test_moved_href():
sync(a, b, status) sync(a, b, status)
b.items['lol'] = b.items.pop('haha') b.items['lol'] = b.items.pop('haha')
a.delete = a.update = a.upload = blow_up a.delete = a.update = a.upload = b.delete = b.update = b.upload = blow_up
sync(a, b, status) sync(a, b, status)
assert len(status) == 1 assert len(status) == 1
assert len(list(a.list())) == len(list(b.list())) == 1 assert len(list(a.list())) == len(list(b.list())) == 1
assert status['haha'][1]['href'] == 'haha' assert status['haha'][1]['href'] == 'lol'
old_status = deepcopy(status)
# Further sync should be a noop
b.get_multi = blow_up
sync(a, b, status)
assert old_status == status
assert len(list(a.list())) == len(list(b.list())) == 1
def test_bogus_etag_change(): def test_bogus_etag_change():

View file

@ -81,7 +81,7 @@ class StorageSyncer(object):
things.''' things.'''
def __init__(self, storage, status): def __init__(self, storage, status):
''' '''
:param status: {ident: (href, etag)} :param status: {ident: {'href': href, 'etag': etag}}
''' '''
self.storage = storage self.storage = storage
self.status = status self.status = status
@ -101,6 +101,11 @@ class StorageSyncer(object):
hrefs=[self.idents[ident]['href'], hrefs=[self.idents[ident]['href'],
href]) href])
if ident in self.status:
# Necessary if item's href changes.
# Otherwise it's a no-op, like `a = a`.
self.status[ident]['href'] = props['href']
for href, etag in self.storage.list(): for href, etag in self.storage.list():
props = {'href': href, 'etag': etag} props = {'href': href, 'etag': etag}
ident, old_meta = href_to_status.get(href, (None, None)) ident, old_meta = href_to_status.get(href, (None, None))