diff --git a/contrib/buildbot/phabricator_wrapper.py b/contrib/buildbot/phabricator_wrapper.py --- a/contrib/buildbot/phabricator_wrapper.py +++ b/contrib/buildbot/phabricator_wrapper.py @@ -474,7 +474,8 @@ ) ) - def update_build_target_status(self, build_target, build_id, status): + def update_build_target_status( + self, build_target, build_id=None, status=None): harbormaster_build_status_mapping = { BuildStatus.Queued: "work", BuildStatus.Running: "work", @@ -482,7 +483,8 @@ BuildStatus.Failure: "fail", } - build_target.update_build_status(build_id, status) + if build_id and status: + build_target.update_build_status(build_id, status) self.harbormaster.sendmessage( buildTargetPHID=build_target.phid, diff --git a/contrib/buildbot/server.py b/contrib/buildbot/server.py --- a/contrib/buildbot/server.py +++ b/contrib/buildbot/server.py @@ -305,7 +305,11 @@ properties)['id'] build_target.queue_build(build_id, build_name) - create_server.db['diff_targets'][target_phid] = build_target + if len(build_target.builds) > 0: + create_server.db['diff_targets'][target_phid] = build_target + else: + phab.update_build_target_status(build_target) + return SUCCESS, 200 @app.route("/land", methods=['POST']) diff --git a/contrib/buildbot/test/test_endpoint_buildDiff.py b/contrib/buildbot/test/test_endpoint_buildDiff.py --- a/contrib/buildbot/test/test_endpoint_buildDiff.py +++ b/contrib/buildbot/test/test_endpoint_buildDiff.py @@ -70,6 +70,10 @@ self.phab.differential.getcommitpaths.assert_called() self.phab.get_file_content_from_master.assert_called() + if len(expectedBuilds) == 0: + self.phab.harbormaster.sendmessage.assert_called_with( + buildTargetPHID=data.targetPHID, type="pass") + expected_calls = [ call(AnyWith(requests.PreparedRequest, { "url": "https://teamcity.test/app/rest/buildQueue", diff --git a/contrib/buildbot/test/test_phabricator.py b/contrib/buildbot/test/test_phabricator.py --- a/contrib/buildbot/test/test_phabricator.py +++ b/contrib/buildbot/test/test_phabricator.py @@ -9,6 +9,7 @@ import os import unittest +from build import BuildStatus, BuildTarget from phabricator_wrapper import BITCOIN_ABC_PROJECT_PHID, BITCOIN_ABC_REPO import test.mocks.phabricator @@ -441,6 +442,41 @@ with self.assertRaisesRegex(AssertionError, "Failed to edit panel"): call_set_text_panel_content() + def test_update_build_target_status(self): + build_target = BuildTarget("PHID-HMBT-1234") + + # With no builds queued, default to pass + self.phab.update_build_target_status(build_target) + self.phab.harbormaster.sendmessage.assert_called_with( + buildTargetPHID=build_target.phid, type="pass") + + # Queue a build + build_target.queue_build("build-1", "build-name") + self.phab.update_build_target_status(build_target) + self.phab.harbormaster.sendmessage.assert_called_with( + buildTargetPHID=build_target.phid, type="work") + + # Test various statuses + self.phab.update_build_target_status( + build_target, "build-1", BuildStatus.Queued) + self.phab.harbormaster.sendmessage.assert_called_with( + buildTargetPHID=build_target.phid, type="work") + + self.phab.update_build_target_status( + build_target, "build-1", BuildStatus.Running) + self.phab.harbormaster.sendmessage.assert_called_with( + buildTargetPHID=build_target.phid, type="work") + + self.phab.update_build_target_status( + build_target, "build-1", BuildStatus.Failure) + self.phab.harbormaster.sendmessage.assert_called_with( + buildTargetPHID=build_target.phid, type="fail") + + self.phab.update_build_target_status( + build_target, "build-1", BuildStatus.Success) + self.phab.harbormaster.sendmessage.assert_called_with( + buildTargetPHID=build_target.phid, type="pass") + def test_get_object_token(self): user_PHID = "PHID-USER-foobarbaz" self.phab.user.whoami.return_value = {