This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author bers
Recipients bers
Date 2022-01-25.09:46:10
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1643103970.65.0.0273493721081.issue46512@roundup.psfhosted.org>
In-reply-to
Content
It is very easy to use filecmp.cmpfiles incorrectly by passing absolute path names. This is because
1. the documentations does not say that relative path names have to be passed, and
2. filecmp.cmpfiles does not issue a warning when absolute path names are passed.

Consider this example code, which does look sensible at first glance:

    files = dir_a.glob("*")
    (equal, _, _) = filecmp.cmpfiles(dir_a, dir_b, files, shallow=False)
    print("equal:", *equal)

However, in the full example below, you will see that this code fails to detect that two files are actually different.

"""Demo behavior of filecmp.cmpfiles with absolute path names."""
import filecmp
import tempfile
from pathlib import Path

with tempfile.TemporaryDirectory() as tmpdirname:
    # prepare two different files
    tmpdir = Path(tmpdirname)
    dir_a = tmpdir / "a"
    dir_b = tmpdir / "b"
    file_a = dir_a / "foo.txt"
    file_b = dir_b / "foo.txt"

    dir_a.mkdir()
    dir_b.mkdir()
    file_a.write_text("A")
    file_b.write_text("B")

    # actually diff the files
    files = dir_a.glob("*")
    # filecmp should issue a warning here!
    (equal, _, _) = filecmp.cmpfiles(dir_a, dir_b, files, shallow=False)
    # otherwise, this result is easy to misinterpret - files are reported as equal
    print("equal:", *equal)
History
Date User Action Args
2022-01-25 09:46:10berssetrecipients: + bers
2022-01-25 09:46:10berssetmessageid: <1643103970.65.0.0273493721081.issue46512@roundup.psfhosted.org>
2022-01-25 09:46:10berslinkissue46512 messages
2022-01-25 09:46:10berscreate