# Checks related to the patch's SRC_URI metadata variable # # Copyright (C) 2016 Intel Corporation # # SPDX-License-Identifier: GPL-2.0-only import base import os import pyparsing from data import PatchTestInput, PatchTestDataStore class SrcUri(base.Metadata): metadata = 'SRC_URI' md5sum = 'md5sum' sha256sum = 'sha256sum' git_regex = pyparsing.Regex('^git\:\/\/.*') def setUp(self): # these tests just make sense on patches that can be merged if not PatchTestInput.repo.canbemerged: self.skip('Patch cannot be merged') def pretest_src_uri_left_files(self): if not self.modified: self.skip('No modified recipes, skipping pretest') # get the proper metadata values for pn in self.modified: # we are not interested in images if 'core-image' in pn: continue rd = self.tinfoil.parse_recipe(pn) PatchTestDataStore['%s-%s-%s' % (self.shortid(), self.metadata, pn)] = rd.getVar(self.metadata) def test_src_uri_left_files(self): if not self.modified: self.skip('No modified recipes, skipping pretest') # get the proper metadata values for pn in self.modified: # we are not interested in images if 'core-image' in pn: continue rd = self.tinfoil.parse_recipe(pn) PatchTestDataStore['%s-%s-%s' % (self.shortid(), self.metadata, pn)] = rd.getVar(self.metadata) for pn in self.modified: pretest_src_uri = PatchTestDataStore['pre%s-%s-%s' % (self.shortid(), self.metadata, pn)].split() test_src_uri = PatchTestDataStore['%s-%s-%s' % (self.shortid(), self.metadata, pn)].split() pretest_files = set([os.path.basename(patch) for patch in pretest_src_uri if patch.startswith('file://')]) test_files = set([os.path.basename(patch) for patch in test_src_uri if patch.startswith('file://')]) # check if files were removed if len(test_files) < len(pretest_files): # get removals from patchset filesremoved_from_patchset = set() for patch in self.patchset: if patch.is_removed_file: filesremoved_from_patchset.add(os.path.basename(patch.path)) # get the deleted files from the SRC_URI filesremoved_from_usr_uri = pretest_files - test_files # finally, get those patches removed at SRC_URI and not removed from the patchset # TODO: we are not taking into account renames, so test may raise false positives not_removed = filesremoved_from_usr_uri - filesremoved_from_patchset if not_removed: self.fail('Patches not removed from tree. Remove them and amend the submitted mbox', data=[('Patch', f) for f in not_removed])