diff --git a/jenkins_epo/bot.py b/jenkins_epo/bot.py index 3cd71b06..1cee9d9f 100644 --- a/jenkins_epo/bot.py +++ b/jenkins_epo/bot.py @@ -110,6 +110,9 @@ def workon(self, head): def run(self, head): self.workon(head) + if self.current.head.payload.get('state') == 'closed': + return logger.info("Skipping closed head.") + logger.info("Listing commits from GitHub.") payload = yield from self.current.head.fetch_commits() self.current.commits = list( diff --git a/jenkins_epo/procedures.py b/jenkins_epo/procedures.py index 1fcd7220..3eac6bfe 100644 --- a/jenkins_epo/procedures.py +++ b/jenkins_epo/procedures.py @@ -17,7 +17,7 @@ import logging from .bot import Bot -from .github import GITHUB, cached_arequest +from .github import GITHUB, cached_arequest, ApiNotFoundError from .repository import Repository, REPOSITORIES, Head, UnauthorizedRepository from .settings import SETTINGS from .tasks import PrinterTask, ProcessTask, RepositoryPollerTask @@ -61,8 +61,7 @@ def print_heads(): @asyncio.coroutine def process_url(url, throttle=True): if not match(url, Repository.heads_filter): - logger.debug("Skipping %s. Filtered.", url) - return + return logger.debug("Skipping %s. Filtered.", url) task = asyncio.Task.current_task() running_task = _task_map.get(url) @@ -73,10 +72,14 @@ def process_url(url, throttle=True): if throttle: yield from throttle_github() - head = yield from Head.from_url(url) + try: + head = yield from Head.from_url(url) + except ApiNotFoundError: + return logger.error("No such head. Skipping.") + if head.repository not in REPOSITORIES: - logger.error("%s not managed.", head.repository) - return + return logger.error("%s not managed.", head.repository) + log_context(head) logger.info("Working on %s.", head) diff --git a/tests/test_bot.py b/tests/test_bot.py index af265521..eaf65dbb 100644 --- a/tests/test_bot.py +++ b/tests/test_bot.py @@ -146,7 +146,7 @@ def test_run_extension(mocker): bot = Bot() assert 'ext' in bot.extensions_map - pr = Mock(name='pr') + pr = Mock(name='pr', payload=dict()) pr.fetch_commits = CoroutineMock() commits = [Mock()] pr.repository.process_commits.return_value = commits @@ -176,7 +176,7 @@ def test_begin_skip_head(mocker): ext.SETTINGS = {} ext.begin.side_effect = SkipHead() - pr = Mock(name='pr') + pr = Mock(name='pr', payload=dict()) pr.fetch_commits = CoroutineMock() commits = [Mock()] pr.repository.process_commits.return_value = commits @@ -189,6 +189,20 @@ def test_begin_skip_head(mocker): assert not ext.run.mock_calls +@pytest.mark.asyncio +@asyncio.coroutine +def test_run_skip_closed(mocker): + pkg_resources = mocker.patch('jenkins_epo.bot.pkg_resources') + + from jenkins_epo.bot import Bot + + pkg_resources.iter_entry_points.return_value = [] + pr = Mock(name='pr') + pr.payload = dict(state='closed') + + yield from Bot().run(pr) + + @pytest.mark.asyncio @asyncio.coroutine def test_run_skip_head(mocker): @@ -204,7 +218,7 @@ def test_run_skip_head(mocker): ext.SETTINGS = {} ext.run.side_effect = SkipHead() - pr = Mock(name='pr') + pr = Mock(name='pr', payload=dict()) pr.fetch_commits = CoroutineMock() commits = [Mock()] pr.repository.process_commits.return_value = commits diff --git a/tests/test_procedures.py b/tests/test_procedures.py index 70ca57bd..b26faf16 100644 --- a/tests/test_procedures.py +++ b/tests/test_procedures.py @@ -59,6 +59,18 @@ def test_process_url_skip(mocker, SETTINGS): yield from process_url('url://') +@pytest.mark.asyncio +@asyncio.coroutine +def test_process_url_not_found(mocker, SETTINGS): + from_url = mocker.patch( + 'jenkins_epo.procedures.Head.from_url', CoroutineMock() + ) + from jenkins_epo.procedures import process_url, ApiNotFoundError + from_url.side_effect = ApiNotFoundError('url://', Mock(), Mock()) + + yield from process_url('url://', throttle=False) + + @pytest.mark.asyncio @asyncio.coroutine def test_process_url(mocker, SETTINGS):