Parcourir la source

Merge "Make files matcher match changes with no files"

tags/3.15.0
Zuul il y a 1 mois
Parent
révision
f2becc9184
4 fichiers modifiés avec 66 ajouts et 33 suppressions
  1. +6
    -0
      releasenotes/notes/file-matcher-pass-when-no-files-f3b4466d8107895e.yaml
  2. +34
    -23
      tests/unit/test_change_matcher.py
  3. +25
    -9
      zuul/change_matcher.py
  4. +1
    -1
      zuul/model.py

+ 6
- 0
releasenotes/notes/file-matcher-pass-when-no-files-f3b4466d8107895e.yaml Voir le fichier

@@ -0,0 +1,6 @@
---
fixes:
- |
Files matcher has been fixed to act like irrelevant files matcher
when no files are present in the tested change, i.e. it now matches
such empty changes instead of rejecting them.

+ 34
- 23
tests/unit/test_change_matcher.py Voir le fichier

@@ -70,24 +70,6 @@ class TestBranchMatcher(BaseTestMatcher):
self.assertFalse(self.matcher.matches(self.change))


class TestFileMatcher(BaseTestMatcher):

def setUp(self):
super(TestFileMatcher, self).setUp()
self.matcher = cm.FileMatcher('filename')

def test_matches_returns_true(self):
self.change.files = ['filename']
self.assertTrue(self.matcher.matches(self.change))

def test_matches_returns_false_when_no_files(self):
self.assertFalse(self.matcher.matches(self.change))

def test_matches_returns_false_when_files_attr_missing(self):
delattr(self.change, 'files')
self.assertFalse(self.matcher.matches(self.change))


class TestAbstractMatcherCollection(BaseTestMatcher):

def test_str(self):
@@ -99,17 +81,20 @@ class TestAbstractMatcherCollection(BaseTestMatcher):
self.assertEqual(repr(matcher), '<MatchAll>')


class TestMatchAllFiles(BaseTestMatcher):

def setUp(self):
super(TestMatchAllFiles, self).setUp()
self.matcher = cm.MatchAllFiles([cm.FileMatcher('^docs/.*$')])
class BaseTestFilesMatcher(BaseTestMatcher):

def _test_matches(self, expected, files=None):
if files is not None:
self.change.files = files
self.assertEqual(expected, self.matcher.matches(self.change))


class TestMatchAllFiles(BaseTestFilesMatcher):

def setUp(self):
super(TestMatchAllFiles, self).setUp()
self.matcher = cm.MatchAllFiles([cm.FileMatcher('^docs/.*$')])

def test_matches_returns_false_when_files_attr_missing(self):
delattr(self.change, 'files')
self._test_matches(False)
@@ -133,6 +118,32 @@ class TestMatchAllFiles(BaseTestMatcher):
self._test_matches(True, files=['docs/foo'])


class TestMatchAnyFiles(BaseTestFilesMatcher):

def setUp(self):
super(TestMatchAnyFiles, self).setUp()
self.matcher = cm.MatchAnyFiles([cm.FileMatcher('^docs/.*$')])

def test_matches_returns_true_when_files_attr_missing(self):
delattr(self.change, 'files')
self._test_matches(True)

def test_matches_returns_true_when_no_files(self):
self._test_matches(True)

def test_matches_returns_true_when_only_commit_message(self):
self._test_matches(True, files=['/COMMIT_MSG'])

def test_matches_returns_true_when_some_files_match(self):
self._test_matches(True, files=['/COMMIT_MSG', 'docs/foo', 'foo/bar'])

def test_matches_returns_true_when_single_file_matches(self):
self._test_matches(True, files=['docs/foo'])

def test_matches_returns_false_when_no_matching_files(self):
self._test_matches(False, files=['/COMMIT_MSG', 'foo/bar'])


class TestMatchAll(BaseTestMatcher):

def test_matches_returns_true(self):

+ 25
- 9
zuul/change_matcher.py Voir le fichier

@@ -85,13 +85,7 @@ class ImpliedBranchMatcher(AbstractChangeMatcher):

class FileMatcher(AbstractChangeMatcher):

def matches(self, change):
if not hasattr(change, 'files'):
return False
for file_ in change.files:
if self.regex.match(file_):
return True
return False
pass


class AbstractMatcherCollection(AbstractChangeMatcher):
@@ -113,7 +107,7 @@ class AbstractMatcherCollection(AbstractChangeMatcher):
return self.__class__(self.matchers[:])


class MatchAllFiles(AbstractMatcherCollection):
class AbstractMatchFiles(AbstractMatcherCollection):

commit_regex = re.compile('^/COMMIT_MSG$')

@@ -121,9 +115,13 @@ class MatchAllFiles(AbstractMatcherCollection):
def regexes(self):
for matcher in self.matchers:
yield matcher.regex
yield self.commit_regex


class MatchAllFiles(AbstractMatchFiles):

def matches(self, change):
# NOTE(yoctozepto): make irrelevant files matcher match when
# there are no files to check - return False (NB: reversed)
if not (hasattr(change, 'files') and change.files):
return False
if len(change.files) == 1 and self.commit_regex.match(change.files[0]):
@@ -134,11 +132,29 @@ class MatchAllFiles(AbstractMatcherCollection):
if regex.match(file_):
matched_file = True
break
if self.commit_regex.match(file_):
matched_file = True
if not matched_file:
return False
return True


class MatchAnyFiles(AbstractMatchFiles):

def matches(self, change):
# NOTE(yoctozepto): make files matcher match when
# there are no files to check - return True
if not (hasattr(change, 'files') and change.files):
return True
if len(change.files) == 1 and self.commit_regex.match(change.files[0]):
return True
for file_ in change.files:
for regex in self.regexes:
if regex.match(file_):
return True
return False


class MatchAll(AbstractMatcherCollection):

def matches(self, change):

+ 1
- 1
zuul/model.py Voir le fichier

@@ -1425,7 +1425,7 @@ class Job(ConfigObject):
matchers = []
for fn in files:
matchers.append(change_matcher.FileMatcher(fn))
self.file_matcher = change_matcher.MatchAny(matchers)
self.file_matcher = change_matcher.MatchAnyFiles(matchers)

def setIrrelevantFileMatcher(self, irrelevant_files):
# Set the irrelevant file matcher to match any of the change files

Chargement…
Annuler
Enregistrer