diff --git a/pmb/helpers/repo.py b/pmb/helpers/repo.py index a27de364..5738a9fb 100644 --- a/pmb/helpers/repo.py +++ b/pmb/helpers/repo.py @@ -53,8 +53,16 @@ def diff(args, files_a, files_b=None): ret = [] for arch in files_b.keys(): for file, timestamp in files_b[arch].items(): - if (arch not in files_a or file not in files_a[arch] or - timestamp is not files_a[arch][file]): + add = False + if arch not in files_a: + add = True + elif file not in files_a[arch]: + add = True + elif timestamp != files_a[arch][file]: + add = True + if add: ret.append(arch + "/" + file) + + return sorted(ret) diff --git a/test/repo.py b/test/repo.py new file mode 100644 index 00000000..c570e29b --- /dev/null +++ b/test/repo.py @@ -0,0 +1,87 @@ +""" +Copyright 2017 Oliver Smith + +This file is part of pmbootstrap. + +pmbootstrap is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +pmbootstrap is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with pmbootstrap. If not, see . +""" +import os +import sys +import pytest +import types +import pathlib +import time + +# Import from parent directory +pmb_src = os.path.abspath(os.path.join(os.path.dirname(__file__) + "/..")) +sys.path.append(pmb_src) +import pmb.helpers.repo + + +@pytest.fixture +def args(request, tmpdir): + args = types.SimpleNamespace() + args.work = str(tmpdir) + return args + +def clear_timestamps_from_files(files): + """ + Replace all last modified timestamps from pmb.helpers.repo.files() with + None. The files-parameter gets changed in place. + """ + for arch in files.keys(): + for file in files[arch].keys(): + files[arch][file] = None + + +def test_files_empty(args): + os.mkdir(args.work + "/packages") + assert pmb.helpers.repo.files(args) == {} + + +def test_files_not_empty(args): + pkgs = args.work + "/packages" + for dir in ["", "armhf", "x86_64"]: + os.mkdir(pkgs + "/" + dir) + open(pkgs+"/x86_64/test", "a").close() + files = pmb.helpers.repo.files(args) + clear_timestamps_from_files(files) + assert files == {"armhf": {}, "x86_64": {"test": None}} + + +def test_files_diff(args): + # Create x86_64/test, x86_64/test2 + pkgs = args.work + "/packages" + for dir in ["", "x86_64"]: + os.mkdir(pkgs + "/" + dir) + for file in ["x86_64/test", "x86_64/test2"]: + open(pkgs + "/" + file, "a").close() + + # First snapshot + first = pmb.helpers.repo.files(args) + + # Change: x86_64/test (set the lastmod timestamp 5 seconds in the future) + mtime_old = os.path.getmtime(pkgs + "/x86_64/test") + time_new = time.time() + 5 + os.utime(pkgs + "/x86_64/test", (time_new, time_new)) + mtime_new = os.path.getmtime(pkgs + "/x86_64/test") + assert mtime_old != mtime_new + + # Create: aarch64/test3, x86_64/test4 + os.mkdir(pkgs + "/aarch64") + open(pkgs + "/aarch64/test3", "a").close() + open(pkgs + "/x86_64/test4", "a").close() + + diff = pmb.helpers.repo.diff(args, first) + assert diff == ["aarch64/test3", "x86_64/test", "x86_64/test4"]