Issue #18149: Add filecmp.clear_cache() to manually clear the filecmp cache.

Patch by Mark Levitt
This commit is contained in:
Ned Deily 2013-06-14 15:19:11 -07:00
parent 3fe35e6503
commit 7bff3cbe3d
5 changed files with 32 additions and 3 deletions

View File

@ -27,6 +27,10 @@ The :mod:`filecmp` module defines the following functions:
Note that no external programs are called from this function, giving it
portability and efficiency.
This function uses a cache for past comparisons and the results,
with a cache invalidation mechanism relying on stale signatures
or by explicitly calling :func:`clear_cache`.
.. function:: cmpfiles(dir1, dir2, common, shallow=True)
@ -48,6 +52,15 @@ The :mod:`filecmp` module defines the following functions:
one of the three returned lists.
.. function:: clear_cache()
.. versionadded:: 3.4
Clear the filecmp cache. This may be useful if a file is compared so quickly
after it is modified that it is within the mtime resolution of
the underlying filesystem.
.. _dircmp-objects:
The :class:`dircmp` class

View File

@ -6,6 +6,7 @@ Classes:
Functions:
cmp(f1, f2, shallow=True) -> int
cmpfiles(a, b, common) -> ([], [], [])
clear_cache()
"""
@ -13,7 +14,7 @@ import os
import stat
from itertools import filterfalse
__all__ = ['cmp', 'dircmp', 'cmpfiles', 'DEFAULT_IGNORES']
__all__ = ['clear_cache', 'cmp', 'dircmp', 'cmpfiles', 'DEFAULT_IGNORES']
_cache = {}
BUFSIZE = 8*1024
@ -21,6 +22,9 @@ BUFSIZE = 8*1024
DEFAULT_IGNORES = [
'RCS', 'CVS', 'tags', '.git', '.hg', '.bzr', '_darcs', '__pycache__']
def clear_cache():
"""Clear the filecmp cache."""
_cache.clear()
def cmp(f1, f2, shallow=True):
"""Compare two files.
@ -39,7 +43,8 @@ def cmp(f1, f2, shallow=True):
True if the files are the same, False otherwise.
This function uses a cache for past comparisons and the results,
with a cache invalidation mechanism relying on stale signatures.
with a cache invalidation mechanism relying on stale signatures
or by explicitly calling clear_cache().
"""
@ -56,7 +61,7 @@ def cmp(f1, f2, shallow=True):
if outcome is None:
outcome = _do_cmp(f1, f2)
if len(_cache) > 100: # limit the maximum size of the cache
_cache.clear()
clear_cache()
_cache[f1, f2, s1, s2] = outcome
return outcome

View File

@ -39,6 +39,13 @@ class FileCompareTestCase(unittest.TestCase):
self.assertFalse(filecmp.cmp(self.name, self.dir),
"File and directory compare as equal")
def test_cache_clear(self):
first_compare = filecmp.cmp(self.name, self.name_same, shallow=False)
second_compare = filecmp.cmp(self.name, self.name_diff, shallow=False)
filecmp.clear_cache()
self.assertTrue(len(filecmp._cache) == 0,
"Cache not cleared after calling clear_cache")
class DirCompareTestCase(unittest.TestCase):
def setUp(self):
tmpdir = tempfile.gettempdir()

View File

@ -738,6 +738,7 @@ Benno Leslie
Christopher Tur Lesniewski-Laas
Alain Leufroy
Mark Levinson
Mark Levitt
William Lewis
Akira Li
Xuanji Li

View File

@ -123,6 +123,9 @@ Core and Builtins
Library
-------
- Issue #18149: Add filecmp.clear_cache() to manually clear the filecmp cache.
Patch by Mark Levitt
- Issue #18193: Add importlib.reload().
- Issue #18157: Stop using imp.load_module() in pydoc.