Merge pull request #5788 from RonnyPfannschmidt/move-chunks-equals

move chunk_equals to module level and modernize tox.ini
This commit is contained in:
TW 2021-05-02 21:14:59 +02:00 committed by GitHub
commit c114e060ec
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 46 additions and 48 deletions

View File

@ -517,36 +517,36 @@ class ItemDiff:
return self._item1.chunks == self._item2.chunks
if self._item1.get_size() != self._item2.get_size():
return False
return ItemDiff._chunk_content_equal(chunk_iterator1, chunk_iterator2)
return chunks_contents_equal(chunk_iterator1, chunk_iterator2)
@staticmethod
def _chunk_content_equal(chunks1, chunks2):
"""
Compare chunk content and return True if they are identical.
The chunks must be given as chunk iterators (like returned by :meth:`.DownloadPipeline.fetch_many`).
"""
def chunks_contents_equal(chunks1, chunks2):
"""
Compare chunk content and return True if they are identical.
end = object()
alen = ai = 0
blen = bi = 0
while True:
if not alen - ai:
a = next(chunks1, end)
if a is end:
return not blen - bi and next(chunks2, end) is end
a = memoryview(a)
alen = len(a)
ai = 0
if not blen - bi:
b = next(chunks2, end)
if b is end:
return not alen - ai and next(chunks1, end) is end
b = memoryview(b)
blen = len(b)
bi = 0
slicelen = min(alen - ai, blen - bi)
if a[ai:ai + slicelen] != b[bi:bi + slicelen]:
return False
ai += slicelen
bi += slicelen
The chunks must be given as chunk iterators (like returned by :meth:`.DownloadPipeline.fetch_many`).
"""
end = object()
alen = ai = 0
blen = bi = 0
while True:
if not alen - ai:
a = next(chunks1, end)
if a is end:
return not blen - bi and next(chunks2, end) is end
a = memoryview(a)
alen = len(a)
ai = 0
if not blen - bi:
b = next(chunks2, end)
if b is end:
return not alen - ai and next(chunks1, end) is end
b = memoryview(b)
blen = len(b)
bi = 0
slicelen = min(alen - ai, blen - bi)
if a[ai:ai + slicelen] != b[bi:bi + slicelen]:
return False
ai += slicelen
bi += slicelen

View File

@ -47,7 +47,7 @@ from ..helpers import msgpack
from ..helpers import flags_noatime, flags_normal
from ..nanorst import RstToTextLazy, rst_to_terminal
from ..patterns import IECommand, PatternMatcher, parse_pattern
from ..item import Item, ItemDiff
from ..item import Item, ItemDiff, chunks_contents_equal
from ..locking import LockFailed
from ..logger import setup_logging
from ..remote import RemoteRepository, PathNotAllowed
@ -4218,8 +4218,8 @@ def test_chunk_content_equal():
def ccc(a, b):
chunks_a = [data for data in a]
chunks_b = [data for data in b]
compare1 = ItemDiff._chunk_content_equal(iter(chunks_a), iter(chunks_b))
compare2 = ItemDiff._chunk_content_equal(iter(chunks_b), iter(chunks_a))
compare1 = chunks_contents_equal(iter(chunks_a), iter(chunks_b))
compare2 = chunks_contents_equal(iter(chunks_b), iter(chunks_a))
assert compare1 == compare2
return compare1
assert ccc([

28
tox.ini
View File

@ -3,31 +3,29 @@
[tox]
envlist = py{36,37,38,39,310}-{none,fuse2,fuse3}
minversion = 3.2
requires =
pkgconfig
cython
wheel
setuptools_scm
[testenv]
setenv =
fuse2: BORG_FUSE_IMPL=llfuse
fuse3: BORG_FUSE_IMPL=pyfuse3
deps =
fuse2: llfuse
fuse3: pyfuse3
-rrequirements.d/development.txt
commands = py.test -v -n {env:XDISTN:1} -rs --cov=borg --cov-config=.coveragerc --benchmark-skip --pyargs {posargs:borg.testsuite}
# fakeroot -u needs some env vars:
passenv = *
[testenv:py{36,37,38,39}-fuse2]
setenv =
BORG_FUSE_IMPL=llfuse
deps =
llfuse
{[testenv]deps}
[testenv:py{36,37,38,39}-fuse3]
setenv =
BORG_FUSE_IMPL=pyfuse3
deps =
pyfuse3
{[testenv]deps}
[testenv:flake8]
skip_sdist=true
skip_install=true
changedir =
deps =
flake8
pkgconfig
commands = flake8 src scripts conftest.py