├── .bbtravis.yml ├── .circleci └── config.yml ├── .coveragerc ├── .github ├── PULL_REQUEST_TEMPLATE.md ├── stale.yml └── workflows │ └── ci.yml ├── .isort.cfg ├── .mailmap ├── .mention-bot ├── .pyup.yml ├── CONTRIBUTING.rst ├── LICENSE ├── Makefile ├── README.flathub.md ├── README.rst ├── RELEASING.rst ├── appveyor.yml ├── common ├── code_spelling_ignore_words.txt ├── coveragerc ├── download_release.py ├── flake8rc ├── gather_dependabot.py ├── hooks │ └── post-commit ├── maketarball.sh ├── merge_and_pep8.sh ├── porttostable.py ├── pylintrc ├── smokedist-download-compatible-chromedriver.py ├── smokedist-www-backwards-compat.py ├── smokedist.sh └── validate.sh ├── master ├── .dockerignore ├── COPYING ├── CREDITS ├── Dockerfile ├── MANIFEST.in ├── Makefile ├── README.rst ├── UPGRADING ├── buildbot │ ├── __init__.py │ ├── buildbot_net_usage_data.py │ ├── buildrequest.py │ ├── builds-test.json │ ├── changes │ │ ├── __init__.py │ │ ├── base.py │ │ ├── bitbucket.py │ │ ├── changes.py │ │ ├── filter.py │ │ ├── gerritchangesource.py │ │ ├── github.py │ │ ├── gitpoller.py │ │ ├── hgpoller.py │ │ ├── mail.py │ │ ├── manager.py │ │ ├── p4poller.py │ │ ├── pb.py │ │ └── svnpoller.py │ ├── clients │ │ ├── __init__.py │ │ ├── base.py │ │ ├── sendchange.py │ │ ├── tryclient.py │ │ └── usersclient.py │ ├── config.py │ ├── configurators │ │ ├── __init__.py │ │ └── janitor.py │ ├── data │ │ ├── __init__.py │ │ ├── base.py │ │ ├── build_data.py │ │ ├── builders.py │ │ ├── buildrequests.py │ │ ├── builds.py │ │ ├── buildsets.py │ │ ├── changes.py │ │ ├── changesources.py │ │ ├── connector.py │ │ ├── exceptions.py │ │ ├── forceschedulers.py │ │ ├── logchunks.py │ │ ├── logs.py │ │ ├── masters.py │ │ ├── patches.py │ │ ├── properties.py │ │ ├── resultspec.py │ │ ├── root.py │ │ ├── schedulers.py │ │ ├── sourcestamps.py │ │ ├── steps.py │ │ ├── test_result_sets.py │ │ ├── test_results.py │ │ ├── types.py │ │ └── workers.py │ ├── db │ │ ├── __init__.py │ │ ├── base.py │ │ ├── build_data.py │ │ ├── builders.py │ │ ├── buildrequests.py │ │ ├── builds.py │ │ ├── buildsets.py │ │ ├── changes.py │ │ ├── changesources.py │ │ ├── connector.py │ │ ├── dbconfig.py │ │ ├── enginestrategy.py │ │ ├── exceptions.py │ │ ├── logs.py │ │ ├── masters.py │ │ ├── migrate │ │ │ ├── README │ │ │ ├── migrate.cfg │ │ │ └── versions │ │ │ │ ├── 040_add_builder_tags.py │ │ │ │ ├── 041_add_N_N_tagsbuilders.py │ │ │ │ ├── 042_add_build_properties_table.py │ │ │ │ ├── 043_changes_parent.py │ │ │ │ ├── 044_add_step_hidden.py │ │ │ │ ├── 045_worker_transition.py │ │ │ │ ├── 046_mysql_innodb_compatibility.py │ │ │ │ ├── 047_cascading_deletes.py │ │ │ │ ├── 048_change_properties_to_text.py │ │ │ │ ├── 049_add_schedulers_enabled.py │ │ │ │ ├── 050_cascading_deletes_all.py │ │ │ │ ├── 051_add_worker_status.py │ │ │ │ ├── 052_cascading_set_null.py │ │ │ │ ├── 053_add_changes_committer.py │ │ │ │ ├── 054_add_index_to_steps.py │ │ │ │ ├── 055_fix_changes_committer.py │ │ │ │ ├── 056_add_test_result_tables.py │ │ │ │ ├── 057_add_build_data_tables.py │ │ │ │ ├── 058_add_build_data_length.py │ │ │ │ └── __init__.py │ │ ├── migrate_utils.py │ │ ├── model.py │ │ ├── pool.py │ │ ├── schedulers.py │ │ ├── sourcestamps.py │ │ ├── state.py │ │ ├── steps.py │ │ ├── tags.py │ │ ├── test_result_sets.py │ │ ├── test_results.py │ │ ├── types │ │ │ ├── __init__.py │ │ │ └── json.py │ │ ├── users.py │ │ └── workers.py │ ├── errors.py │ ├── flathub_builds.py │ ├── flathub_master.py │ ├── interfaces.py │ ├── locks.py │ ├── machine │ │ ├── __init__.py │ │ ├── base.py │ │ ├── generic.py │ │ ├── latent.py │ │ └── manager.py │ ├── manhole.py │ ├── master.py │ ├── monkeypatches │ │ ├── __init__.py │ │ ├── decorators.py │ │ └── servicechecks.py │ ├── mq │ │ ├── __init__.py │ │ ├── base.py │ │ ├── connector.py │ │ ├── simple.py │ │ └── wamp.py │ ├── newsfragments │ │ └── README.txt │ ├── pbmanager.py │ ├── pbutil.py │ ├── plugins │ │ ├── __init__.py │ │ └── db.py │ ├── process │ │ ├── __init__.py │ │ ├── base.py │ │ ├── botmaster.py │ │ ├── build.py │ │ ├── builder.py │ │ ├── buildrequest.py │ │ ├── buildrequestdistributor.py │ │ ├── buildstep.py │ │ ├── cache.py │ │ ├── debug.py │ │ ├── factory.py │ │ ├── log.py │ │ ├── logobserver.py │ │ ├── measured_service.py │ │ ├── metrics.py │ │ ├── properties.py │ │ ├── remotecommand.py │ │ ├── remotetransfer.py │ │ ├── results.py │ │ ├── subunitlogobserver.py │ │ ├── users │ │ │ ├── __init__.py │ │ │ ├── manager.py │ │ │ ├── manual.py │ │ │ └── users.py │ │ └── workerforbuilder.py │ ├── reporters │ │ ├── __init__.py │ │ ├── base.py │ │ ├── bitbucket.py │ │ ├── bitbucketserver.py │ │ ├── generators │ │ │ ├── __init__.py │ │ │ ├── build.py │ │ │ ├── buildset.py │ │ │ ├── utils.py │ │ │ └── worker.py │ │ ├── gerrit.py │ │ ├── gerrit_verify_status.py │ │ ├── github.py │ │ ├── gitlab.py │ │ ├── hipchat.py │ │ ├── http.py │ │ ├── irc.py │ │ ├── mail.py │ │ ├── message.py │ │ ├── notifier.py │ │ ├── pushjet.py │ │ ├── pushover.py │ │ ├── stash.py │ │ ├── telegram.py │ │ ├── templates │ │ │ ├── default_mail.txt │ │ │ ├── default_notification.txt │ │ │ ├── missing_mail.txt │ │ │ └── missing_notification.txt │ │ ├── utils.py │ │ ├── words.py │ │ └── zulip.py │ ├── revlinks.py │ ├── scheduler.py │ ├── schedulers │ │ ├── __init__.py │ │ ├── base.py │ │ ├── basic.py │ │ ├── dependent.py │ │ ├── filter.py │ │ ├── forcesched.py │ │ ├── manager.py │ │ ├── timed.py │ │ ├── triggerable.py │ │ └── trysched.py │ ├── scripts │ │ ├── __init__.py │ │ ├── base.py │ │ ├── buildbot_tac.tmpl │ │ ├── checkconfig.py │ │ ├── cleanupdb.py │ │ ├── create_master.py │ │ ├── dataspec.py │ │ ├── devproxy.py │ │ ├── flat-manager-client │ │ ├── flathub-cleanup.sh │ │ ├── flathub-merge-sources.sh │ │ ├── logwatcher.py │ │ ├── reconfig.py │ │ ├── restart.py │ │ ├── runner.py │ │ ├── sample.cfg │ │ ├── sendchange.py │ │ ├── start.py │ │ ├── stop.py │ │ ├── trycmd.py │ │ ├── tryserver.py │ │ ├── upgrade_master.py │ │ ├── user.py │ │ └── windows_service.py │ ├── secrets │ │ ├── __init__.py │ │ ├── manager.py │ │ ├── providers │ │ │ ├── __init__.py │ │ │ ├── base.py │ │ │ ├── file.py │ │ │ ├── passwordstore.py │ │ │ └── vault.py │ │ └── secret.py │ ├── spec │ │ ├── api.raml │ │ ├── indent.py │ │ └── types │ │ │ ├── build.raml │ │ │ ├── build_data.raml │ │ │ ├── builder.raml │ │ │ ├── buildrequest.raml │ │ │ ├── buildset.raml │ │ │ ├── change.raml │ │ │ ├── changesource.raml │ │ │ ├── forcescheduler.raml │ │ │ ├── identifier.raml │ │ │ ├── log.raml │ │ │ ├── logchunk.raml │ │ │ ├── master.raml │ │ │ ├── patch.raml │ │ │ ├── rootlink.raml │ │ │ ├── scheduler.raml │ │ │ ├── sourcedproperties.raml │ │ │ ├── sourcestamp.raml │ │ │ ├── spec.raml │ │ │ ├── step.raml │ │ │ ├── test_result.raml │ │ │ ├── test_result_set.raml │ │ │ └── worker.raml │ ├── statistics │ │ ├── __init__.py │ │ ├── capture.py │ │ ├── stats_service.py │ │ └── storage_backends │ │ │ ├── __init__.py │ │ │ ├── base.py │ │ │ └── influxdb_client.py │ ├── status │ │ ├── __init__.py │ │ ├── base.py │ │ ├── base_compat.py │ │ ├── build.py │ │ ├── build_compat.py │ │ ├── builder.py │ │ ├── builder_compat.py │ │ ├── buildrequest.py │ │ ├── buildrequest_compat.py │ │ ├── buildset.py │ │ ├── buildset_compat.py │ │ ├── client.py │ │ ├── client_compat.py │ │ ├── event.py │ │ ├── event_compat.py │ │ ├── master.py │ │ ├── master_compat.py │ │ ├── web │ │ │ └── __init__.py │ │ ├── worker.py │ │ └── worker_compat.py │ ├── steps │ │ ├── __init__.py │ │ ├── cmake.py │ │ ├── cppcheck.py │ │ ├── download_secret_to_worker.py │ │ ├── http.py │ │ ├── http_oldstyle.py │ │ ├── master.py │ │ ├── master_oldstyle.py │ │ ├── maxq.py │ │ ├── mswin.py │ │ ├── mtrlogobserver.py │ │ ├── package │ │ │ ├── __init__.py │ │ │ ├── deb │ │ │ │ ├── __init__.py │ │ │ │ ├── lintian.py │ │ │ │ └── pbuilder.py │ │ │ ├── rpm │ │ │ │ ├── __init__.py │ │ │ │ ├── mock.py │ │ │ │ ├── rpmbuild.py │ │ │ │ └── rpmlint.py │ │ │ └── util.py │ │ ├── python.py │ │ ├── python_twisted.py │ │ ├── shell.py │ │ ├── shell_oldstyle.py │ │ ├── shellsequence.py │ │ ├── source │ │ │ ├── __init__.py │ │ │ ├── base.py │ │ │ ├── bzr.py │ │ │ ├── cvs.py │ │ │ ├── darcs.py │ │ │ ├── gerrit.py │ │ │ ├── git.py │ │ │ ├── github.py │ │ │ ├── gitlab.py │ │ │ ├── mercurial.py │ │ │ ├── mtn.py │ │ │ ├── p4.py │ │ │ ├── repo.py │ │ │ └── svn.py │ │ ├── subunit.py │ │ ├── transfer.py │ │ ├── trigger.py │ │ ├── vstudio.py │ │ └── worker.py │ ├── test │ │ ├── __init__.py │ │ ├── fake │ │ │ ├── __init__.py │ │ │ ├── botmaster.py │ │ │ ├── bworkermanager.py │ │ │ ├── change.py │ │ │ ├── docker.py │ │ │ ├── endpoint.py │ │ │ ├── fakebuild.py │ │ │ ├── fakedata.py │ │ │ ├── fakemaster.py │ │ │ ├── fakemq.py │ │ │ ├── fakeprotocol.py │ │ │ ├── fakestats.py │ │ │ ├── httpclientservice.py │ │ │ ├── kube.py │ │ │ ├── latent.py │ │ │ ├── libvirt.py │ │ │ ├── logfile.py │ │ │ ├── machine.py │ │ │ ├── openstack.py │ │ │ ├── pbmanager.py │ │ │ ├── private_tempdir.py │ │ │ ├── reactor.py │ │ │ ├── remotecommand.py │ │ │ ├── secrets.py │ │ │ ├── state.py │ │ │ ├── step.py │ │ │ ├── web.py │ │ │ └── worker.py │ │ ├── fakedb │ │ │ ├── __init__.py │ │ │ ├── base.py │ │ │ ├── build_data.py │ │ │ ├── builders.py │ │ │ ├── buildrequests.py │ │ │ ├── builds.py │ │ │ ├── buildsets.py │ │ │ ├── changes.py │ │ │ ├── changesources.py │ │ │ ├── connector.py │ │ │ ├── logs.py │ │ │ ├── masters.py │ │ │ ├── row.py │ │ │ ├── schedulers.py │ │ │ ├── sourcestamps.py │ │ │ ├── state.py │ │ │ ├── steps.py │ │ │ ├── tags.py │ │ │ ├── test_result_sets.py │ │ │ ├── test_results.py │ │ │ ├── users.py │ │ │ └── workers.py │ │ ├── fuzz │ │ │ ├── __init__.py │ │ │ └── test_lru.py │ │ ├── integration │ │ │ ├── README.txt │ │ │ ├── __init__.py │ │ │ ├── interop │ │ │ │ ├── __init__.py │ │ │ │ ├── test_commandmixin.py │ │ │ │ ├── test_compositestepmixin.py │ │ │ │ ├── test_integration_secrets.py │ │ │ │ ├── test_interruptcommand.py │ │ │ │ ├── test_setpropertyfromcommand.py │ │ │ │ ├── test_transfer.py │ │ │ │ └── test_worker_reconnect.py │ │ │ ├── pki │ │ │ │ ├── 127.0.0.1.crt │ │ │ │ ├── 127.0.0.1.key │ │ │ │ └── ca │ │ │ │ │ └── ca.crt │ │ │ ├── test_URLs.py │ │ │ ├── test_configs.py │ │ │ ├── test_custom_buildstep.py │ │ │ ├── test_customservices.py │ │ │ ├── test_integration_force_with_patch.py │ │ │ ├── test_integration_mastershell.py │ │ │ ├── test_integration_scheduler_reconfigure.py │ │ │ ├── test_integration_secrets_with_vault.py │ │ │ ├── test_integration_template.py │ │ │ ├── test_integration_with_secrets.py │ │ │ ├── test_locks.py │ │ │ ├── test_log_finish.py │ │ │ ├── test_master.py │ │ │ ├── test_notifier.py │ │ │ ├── test_process_botmaster.py │ │ │ ├── test_stop_build.py │ │ │ ├── test_stop_trigger.py │ │ │ ├── test_telegram_bot.py │ │ │ ├── test_trigger.py │ │ │ ├── test_try_client.py │ │ │ ├── test_try_client_e2e.py │ │ │ ├── test_upgrade.py │ │ │ ├── test_usePty.py │ │ │ ├── test_virtual_builder.py │ │ │ ├── test_worker.py │ │ │ ├── test_worker_comm.py │ │ │ ├── test_worker_kubernetes.py │ │ │ ├── test_worker_latent.py │ │ │ ├── test_worker_marathon.py │ │ │ ├── test_worker_upcloud.py │ │ │ ├── test_worker_workerside.py │ │ │ ├── test_www.py │ │ │ ├── v087p1-README.txt │ │ │ ├── v087p1.tgz │ │ │ ├── v090b4-README.txt │ │ │ └── v090b4.tgz │ │ ├── regressions │ │ │ ├── __init__.py │ │ │ ├── test_bad_change_properties_rows.py │ │ │ ├── test_oldpaths.py │ │ │ └── test_steps_shell_WarningCountingShellCommand.py │ │ ├── test_extra_coverage.py │ │ ├── unit │ │ │ ├── __init__.py │ │ │ ├── changes │ │ │ │ ├── __init__.py │ │ │ │ ├── test_base.py │ │ │ │ ├── test_bitbucket.py │ │ │ │ ├── test_changes.py │ │ │ │ ├── test_filter.py │ │ │ │ ├── test_gerritchangesource.py │ │ │ │ ├── test_github.py │ │ │ │ ├── test_gitpoller.py │ │ │ │ ├── test_hgpoller.py │ │ │ │ ├── test_mail.py │ │ │ │ ├── test_mail_CVSMaildirSource.py │ │ │ │ ├── test_manager.py │ │ │ │ ├── test_p4poller.py │ │ │ │ ├── test_pb.py │ │ │ │ └── test_svnpoller.py │ │ │ ├── data │ │ │ │ ├── __init__.py │ │ │ │ ├── test_base.py │ │ │ │ ├── test_build_data.py │ │ │ │ ├── test_builders.py │ │ │ │ ├── test_buildrequests.py │ │ │ │ ├── test_builds.py │ │ │ │ ├── test_buildsets.py │ │ │ │ ├── test_changes.py │ │ │ │ ├── test_changesources.py │ │ │ │ ├── test_connector.py │ │ │ │ ├── test_forceschedulers.py │ │ │ │ ├── test_logchunks.py │ │ │ │ ├── test_logs.py │ │ │ │ ├── test_masters.py │ │ │ │ ├── test_patches.py │ │ │ │ ├── test_properties.py │ │ │ │ ├── test_resultspec.py │ │ │ │ ├── test_root.py │ │ │ │ ├── test_schedulers.py │ │ │ │ ├── test_sourcestamps.py │ │ │ │ ├── test_steps.py │ │ │ │ ├── test_test_result_sets.py │ │ │ │ ├── test_test_results.py │ │ │ │ ├── test_types.py │ │ │ │ └── test_workers.py │ │ │ ├── db │ │ │ │ ├── __init__.py │ │ │ │ ├── test_base.py │ │ │ │ ├── test_build_data.py │ │ │ │ ├── test_builders.py │ │ │ │ ├── test_buildrequests.py │ │ │ │ ├── test_builds.py │ │ │ │ ├── test_buildsets.py │ │ │ │ ├── test_changes.py │ │ │ │ ├── test_changesources.py │ │ │ │ ├── test_connector.py │ │ │ │ ├── test_dbconfig.py │ │ │ │ ├── test_enginestrategy.py │ │ │ │ ├── test_logs.py │ │ │ │ ├── test_masters.py │ │ │ │ ├── test_model.py │ │ │ │ ├── test_pool.py │ │ │ │ ├── test_schedulers.py │ │ │ │ ├── test_sourcestamps.py │ │ │ │ ├── test_state.py │ │ │ │ ├── test_steps.py │ │ │ │ ├── test_test_result_sets.py │ │ │ │ ├── test_test_results.py │ │ │ │ ├── test_users.py │ │ │ │ └── test_workers.py │ │ │ ├── db_migrate │ │ │ │ ├── __init__.py │ │ │ │ ├── test_versions_040_add_builder_tags.py │ │ │ │ ├── test_versions_041_add_N_N_tagsbuilders.py │ │ │ │ ├── test_versions_042_add_build_properties_table.py │ │ │ │ ├── test_versions_043_add_changes_parent.py │ │ │ │ ├── test_versions_044_add_step_hidden.py │ │ │ │ ├── test_versions_045_worker_transition.py │ │ │ │ ├── test_versions_046_mysql_innodb_compatibility.py │ │ │ │ ├── test_versions_047_cascading_deleletes.py │ │ │ │ ├── test_versions_048_change_properties_to_text.py │ │ │ │ ├── test_versions_049_add_schedulers_enabled.py │ │ │ │ ├── test_versions_050_cascading_deletes_all.py │ │ │ │ ├── test_versions_051_add_workers_status.py │ │ │ │ ├── test_versions_052_cascading_set_null.py │ │ │ │ ├── test_versions_053_add_changes_committer.py │ │ │ │ ├── test_versions_054_add_index_to_steps.py │ │ │ │ ├── test_versions_055_add_changes_committer.py │ │ │ │ ├── test_versions_056_add_test_result_tables.py │ │ │ │ ├── test_versions_057_add_build_data_tables.py │ │ │ │ └── test_versions_058_add_build_data_length.py │ │ │ ├── process │ │ │ │ ├── __init__.py │ │ │ │ ├── test_botmaster_BotMaster.py │ │ │ │ ├── test_build.py │ │ │ │ ├── test_builder.py │ │ │ │ ├── test_buildrequest.py │ │ │ │ ├── test_buildrequestdistributor.py │ │ │ │ ├── test_buildstep.py │ │ │ │ ├── test_cache.py │ │ │ │ ├── test_debug.py │ │ │ │ ├── test_factory.py │ │ │ │ ├── test_log.py │ │ │ │ ├── test_logobserver.py │ │ │ │ ├── test_metrics.py │ │ │ │ ├── test_properties.py │ │ │ │ ├── test_remotecommand.py │ │ │ │ ├── test_remotetransfer.py │ │ │ │ ├── test_results.py │ │ │ │ ├── test_users_manager.py │ │ │ │ ├── test_users_manual.py │ │ │ │ ├── test_users_users.py │ │ │ │ └── test_workerforbuilder.py │ │ │ ├── reporters │ │ │ │ ├── __init__.py │ │ │ │ ├── test_base.py │ │ │ │ ├── test_bitbucket.py │ │ │ │ ├── test_bitbucketserver.py │ │ │ │ ├── test_generators_build.py │ │ │ │ ├── test_generators_worker.py │ │ │ │ ├── test_gerrit.py │ │ │ │ ├── test_gerrit_verify_status.py │ │ │ │ ├── test_github.py │ │ │ │ ├── test_gitlab.py │ │ │ │ ├── test_hipchat.py │ │ │ │ ├── test_http.py │ │ │ │ ├── test_irc.py │ │ │ │ ├── test_mail.py │ │ │ │ ├── test_message.py │ │ │ │ ├── test_pushjet.py │ │ │ │ ├── test_pushover.py │ │ │ │ ├── test_telegram.py │ │ │ │ ├── test_utils.py │ │ │ │ ├── test_words.py │ │ │ │ └── test_zulip.py │ │ │ ├── schedulers │ │ │ │ ├── __init__.py │ │ │ │ ├── test_base.py │ │ │ │ ├── test_basic.py │ │ │ │ ├── test_dependent.py │ │ │ │ ├── test_forcesched.py │ │ │ │ ├── test_manager.py │ │ │ │ ├── test_timed_Nightly.py │ │ │ │ ├── test_timed_NightlyBase.py │ │ │ │ ├── test_timed_NightlyTriggerable.py │ │ │ │ ├── test_timed_Periodic.py │ │ │ │ ├── test_timed_Timed.py │ │ │ │ ├── test_triggerable.py │ │ │ │ └── test_trysched.py │ │ │ ├── scripts │ │ │ │ ├── __init__.py │ │ │ │ ├── test_base.py │ │ │ │ ├── test_checkconfig.py │ │ │ │ ├── test_cleanupdb.py │ │ │ │ ├── test_create_master.py │ │ │ │ ├── test_logwatcher.py │ │ │ │ ├── test_restart.py │ │ │ │ ├── test_runner.py │ │ │ │ ├── test_sendchange.py │ │ │ │ ├── test_start.py │ │ │ │ ├── test_stop.py │ │ │ │ ├── test_trycmd.py │ │ │ │ ├── test_tryserver.py │ │ │ │ ├── test_upgrade_master.py │ │ │ │ └── test_user.py │ │ │ ├── steps │ │ │ │ ├── __init__.py │ │ │ │ ├── test_cmake.py │ │ │ │ ├── test_cppcheck.py │ │ │ │ ├── test_http.py │ │ │ │ ├── test_http_oldstyle.py │ │ │ │ ├── test_master.py │ │ │ │ ├── test_master_oldstyle.py │ │ │ │ ├── test_maxq.py │ │ │ │ ├── test_mswin.py │ │ │ │ ├── test_mtrlogobserver.py │ │ │ │ ├── test_package_deb_lintian.py │ │ │ │ ├── test_package_deb_pbuilder.py │ │ │ │ ├── test_package_rpm_mock.py │ │ │ │ ├── test_package_rpm_rpmbuild.py │ │ │ │ ├── test_package_rpm_rpmlint.py │ │ │ │ ├── test_python.py │ │ │ │ ├── test_python_twisted.py │ │ │ │ ├── test_renderable.py │ │ │ │ ├── test_shell.py │ │ │ │ ├── test_shell_oldstyle.py │ │ │ │ ├── test_shellsequence.py │ │ │ │ ├── test_source_base_Source.py │ │ │ │ ├── test_source_bzr.py │ │ │ │ ├── test_source_cvs.py │ │ │ │ ├── test_source_darcs.py │ │ │ │ ├── test_source_gerrit.py │ │ │ │ ├── test_source_git.py │ │ │ │ ├── test_source_github.py │ │ │ │ ├── test_source_gitlab.py │ │ │ │ ├── test_source_mercurial.py │ │ │ │ ├── test_source_mtn.py │ │ │ │ ├── test_source_p4.py │ │ │ │ ├── test_source_repo.py │ │ │ │ ├── test_source_svn.py │ │ │ │ ├── test_subunit.py │ │ │ │ ├── test_transfer.py │ │ │ │ ├── test_trigger.py │ │ │ │ ├── test_vstudio.py │ │ │ │ └── test_worker.py │ │ │ ├── test_buildbot_net_usage_data.py │ │ │ ├── test_clients_sendchange.py │ │ │ ├── test_clients_tryclient.py │ │ │ ├── test_clients_usersclient.py │ │ │ ├── test_config.py │ │ │ ├── test_configurator_base.py │ │ │ ├── test_contrib_buildbot_cvs_mail.py │ │ │ ├── test_download_secret_to_worker.py │ │ │ ├── test_fake_httpclientservice.py │ │ │ ├── test_fake_secrets_manager.py │ │ │ ├── test_interpolate_secrets.py │ │ │ ├── test_janitor_configurator.py │ │ │ ├── test_locks.py │ │ │ ├── test_machine_generic.py │ │ │ ├── test_master.py │ │ │ ├── test_mq.py │ │ │ ├── test_mq_base.py │ │ │ ├── test_mq_connector.py │ │ │ ├── test_mq_simple.py │ │ │ ├── test_mq_wamp.py │ │ │ ├── test_pbmanager.py │ │ │ ├── test_plugins.py │ │ │ ├── test_revlinks.py │ │ │ ├── test_secret_in_file.py │ │ │ ├── test_secret_in_passwordstore.py │ │ │ ├── test_secret_in_vault.py │ │ │ ├── test_secret_rendered_service.py │ │ │ ├── test_stats_service.py │ │ │ ├── test_templates_dir │ │ │ │ ├── builds.html │ │ │ │ └── plugin │ │ │ │ │ └── plugin.jade │ │ │ ├── test_test_util_gpo.py │ │ │ ├── test_test_util_validation.py │ │ │ ├── test_test_util_warnings.py │ │ │ ├── test_util.py │ │ │ ├── test_version.py │ │ │ ├── test_wamp_connector.py │ │ │ ├── util │ │ │ │ ├── __init__.py │ │ │ │ ├── test_ComparableMixin.py │ │ │ │ ├── test_bbcollections.py │ │ │ │ ├── test_codebase.py │ │ │ │ ├── test_debounce.py │ │ │ │ ├── test_deferwaiter.py │ │ │ │ ├── test_eventual.py │ │ │ │ ├── test_git.py │ │ │ │ ├── test_giturlparse.py │ │ │ │ ├── test_httpclientservice.py │ │ │ │ ├── test_identifiers.py │ │ │ │ ├── test_interfaces.py │ │ │ │ ├── test_kubeclientservice.py │ │ │ │ ├── test_lineboundaries.py │ │ │ │ ├── test_lru.py │ │ │ │ ├── test_maildir.py │ │ │ │ ├── test_misc.py │ │ │ │ ├── test_netstrings.py │ │ │ │ ├── test_notifier.py │ │ │ │ ├── test_patch_delay.py │ │ │ │ ├── test_pathmatch.py │ │ │ │ ├── test_poll.py │ │ │ │ ├── test_private_tempdir.py │ │ │ │ ├── test_protocol.py │ │ │ │ ├── test_raml.py │ │ │ │ ├── test_sautils.py │ │ │ │ ├── test_service.py │ │ │ │ ├── test_ssl.py │ │ │ │ ├── test_state.py │ │ │ │ ├── test_subscriptions.py │ │ │ │ ├── test_test_result_submitter.py │ │ │ │ └── test_tuplematch.py │ │ │ ├── worker │ │ │ │ ├── __init__.py │ │ │ │ ├── test_base.py │ │ │ │ ├── test_docker.py │ │ │ │ ├── test_ec2.py │ │ │ │ ├── test_kubernetes.py │ │ │ │ ├── test_libvirt.py │ │ │ │ ├── test_local.py │ │ │ │ ├── test_manager.py │ │ │ │ ├── test_marathon.py │ │ │ │ ├── test_openstack.py │ │ │ │ ├── test_protocols_base.py │ │ │ │ ├── test_protocols_pb.py │ │ │ │ └── test_upcloud.py │ │ │ └── www │ │ │ │ ├── __init__.py │ │ │ │ ├── test_auth.py │ │ │ │ ├── test_authz.py │ │ │ │ ├── test_avatar.py │ │ │ │ ├── test_config.py │ │ │ │ ├── test_endpointmatchers.py │ │ │ │ ├── test_hooks_base.py │ │ │ │ ├── test_hooks_bitbucket.py │ │ │ │ ├── test_hooks_bitbucketcloud.py │ │ │ │ ├── test_hooks_bitbucketserver.py │ │ │ │ ├── test_hooks_github.py │ │ │ │ ├── test_hooks_gitlab.py │ │ │ │ ├── test_hooks_gitorious.py │ │ │ │ ├── test_hooks_poller.py │ │ │ │ ├── test_ldapuserinfo.py │ │ │ │ ├── test_oauth.py │ │ │ │ ├── test_resource.py │ │ │ │ ├── test_rest.py │ │ │ │ ├── test_roles.py │ │ │ │ ├── test_service.py │ │ │ │ ├── test_sse.py │ │ │ │ └── test_ws.py │ │ └── util │ │ │ ├── __init__.py │ │ │ ├── changesource.py │ │ │ ├── config.py │ │ │ ├── configurators.py │ │ │ ├── connector_component.py │ │ │ ├── db.py │ │ │ ├── decorators.py │ │ │ ├── dirs.py │ │ │ ├── endpoint.py │ │ │ ├── fuzz.py │ │ │ ├── gpo.py │ │ │ ├── integration.py │ │ │ ├── interfaces.py │ │ │ ├── logging.py │ │ │ ├── migration.py │ │ │ ├── misc.py │ │ │ ├── patch_delay.py │ │ │ ├── pbmanager.py │ │ │ ├── properties.py │ │ │ ├── protocols.py │ │ │ ├── querylog.py │ │ │ ├── reporter.py │ │ │ ├── sandboxed_worker.py │ │ │ ├── scheduler.py │ │ │ ├── sourcesteps.py │ │ │ ├── steps.py │ │ │ ├── tuplematching.py │ │ │ ├── validation.py │ │ │ ├── warnings.py │ │ │ └── www.py │ ├── util │ │ ├── __init__.py │ │ ├── _notifier.py │ │ ├── bbcollections.py │ │ ├── codebase.py │ │ ├── config.py │ │ ├── croniter.py │ │ ├── debounce.py │ │ ├── deferwaiter.py │ │ ├── eventual.py │ │ ├── git.py │ │ ├── giturlparse.py │ │ ├── httpclientservice.py │ │ ├── identifiers.py │ │ ├── kubeclientservice.py │ │ ├── latent.py │ │ ├── lineboundaries.py │ │ ├── logger.py │ │ ├── lru.py │ │ ├── maildir.py │ │ ├── misc.py │ │ ├── netstrings.py │ │ ├── pathmatch.py │ │ ├── poll.py │ │ ├── private_tempdir.py │ │ ├── protocol.py │ │ ├── raml.py │ │ ├── sautils.py │ │ ├── service.py │ │ ├── ssl.py │ │ ├── state.py │ │ ├── subscription.py │ │ ├── test_result_submitter.py │ │ └── tuplematch.py │ ├── wamp │ │ ├── __init__.py │ │ └── connector.py │ ├── warnings.py │ ├── worker │ │ ├── __init__.py │ │ ├── base.py │ │ ├── docker.py │ │ ├── ec2.py │ │ ├── kubernetes.py │ │ ├── latent.py │ │ ├── libvirt.py │ │ ├── local.py │ │ ├── manager.py │ │ ├── marathon.py │ │ ├── openstack.py │ │ ├── protocols │ │ │ ├── __init__.py │ │ │ ├── base.py │ │ │ ├── null.py │ │ │ └── pb.py │ │ └── upcloud.py │ └── www │ │ ├── __init__.py │ │ ├── auth.py │ │ ├── authz │ │ ├── __init__.py │ │ ├── authz.py │ │ ├── endpointmatchers.py │ │ └── roles.py │ │ ├── avatar.py │ │ ├── change_hook.py │ │ ├── config.py │ │ ├── hooks │ │ ├── __init__.py │ │ ├── base.py │ │ ├── bitbucket.py │ │ ├── bitbucketcloud.py │ │ ├── bitbucketserver.py │ │ ├── github.py │ │ ├── gitlab.py │ │ ├── gitorious.py │ │ └── poller.py │ │ ├── ldapuserinfo.py │ │ ├── oauth2.py │ │ ├── plugin.py │ │ ├── resource.py │ │ ├── rest.py │ │ ├── service.py │ │ ├── sse.py │ │ └── ws.py ├── docker │ ├── README.md │ ├── buildbot.tac │ └── start_buildbot.sh ├── docs │ ├── Makefile │ ├── _images │ │ ├── full_logo.png │ │ ├── full_logo.svg │ │ ├── header-text-transparent.png │ │ └── success_normal.png │ ├── _static │ │ ├── buildbot_rtd.css │ │ ├── icon.png │ │ └── icon.svg │ ├── _templates │ │ └── localtoc.html │ ├── bbdocs │ │ ├── __init__.py │ │ ├── api_index.py │ │ ├── ext.py │ │ └── test │ │ │ └── __init__.py │ ├── buildbot.1 │ ├── conf.py │ ├── developer │ │ ├── _images │ │ │ └── stats-service.png │ │ ├── auth.rst │ │ ├── authz.rst │ │ ├── br-claiming.rst │ │ ├── classes.rst │ │ ├── cls-auth.rst │ │ ├── cls-avatar.rst │ │ ├── cls-basescheduler.rst │ │ ├── cls-build.rst │ │ ├── cls-buildfactory.rst │ │ ├── cls-buildsetsummarynotifiermixin.rst │ │ ├── cls-buildsteps.rst │ │ ├── cls-changesources.rst │ │ ├── cls-forcesched.rst │ │ ├── cls-iconfigurator.rst │ │ ├── cls-iproperties.rst │ │ ├── cls-irenderable.rst │ │ ├── cls-log.rst │ │ ├── cls-logobserver.rst │ │ ├── cls-protocols.rst │ │ ├── cls-remotecommands.rst │ │ ├── cls-resultspec.rst │ │ ├── cls-worker.rst │ │ ├── cls-workermanager.rst │ │ ├── cls-www.rst │ │ ├── config.rst │ │ ├── data.rst │ │ ├── database.rst │ │ ├── database │ │ │ ├── build_data.rst │ │ │ ├── builders.rst │ │ │ ├── buildrequests.rst │ │ │ ├── builds.rst │ │ │ ├── buildsets.rst │ │ │ ├── changes.rst │ │ │ ├── changesources.rst │ │ │ ├── index.rst │ │ │ ├── logs.rst │ │ │ ├── masters.rst │ │ │ ├── schedulers.rst │ │ │ ├── sourcestamps.rst │ │ │ ├── state.rst │ │ │ ├── steps.rst │ │ │ ├── users.rst │ │ │ └── workers.rst │ │ ├── encodings.rst │ │ ├── general.rst │ │ ├── index.rst │ │ ├── master-overview.rst │ │ ├── master-worker.rst │ │ ├── metrics.rst │ │ ├── mq.rst │ │ ├── plugins-publish.rst │ │ ├── pull-request.rst │ │ ├── quickstart.rst │ │ ├── raml │ │ │ ├── build.rst │ │ │ ├── build_data.rst │ │ │ ├── builder.rst │ │ │ ├── buildrequest.rst │ │ │ ├── buildset.rst │ │ │ ├── change.rst │ │ │ ├── changesource.rst │ │ │ ├── forcescheduler.rst │ │ │ ├── identifier.rst │ │ │ ├── index.rst │ │ │ ├── log.rst │ │ │ ├── logchunk.rst │ │ │ ├── master.rst │ │ │ ├── patch.rst │ │ │ ├── raw-endpoints.rst │ │ │ ├── rootlink.rst │ │ │ ├── scheduler.rst │ │ │ ├── sourcedproperties.rst │ │ │ ├── sourcestamp.rst │ │ │ ├── spec.rst │ │ │ ├── step.rst │ │ │ ├── test_result.rst │ │ │ ├── test_result_set.rst │ │ │ └── worker.rst │ │ ├── rest.rst │ │ ├── results.rst │ │ ├── schedulers.rst │ │ ├── secrets.rst │ │ ├── stats-service.rst │ │ ├── style.rst │ │ ├── tests.rst │ │ ├── utils.rst │ │ ├── www-base-app.rst │ │ ├── www-data-module.rst │ │ └── www-server.rst │ ├── examples │ │ ├── git_gerrit.cfg │ │ ├── gitlab.cfg │ │ ├── hello.cfg │ │ ├── repo_gerrit.cfg │ │ └── twisted_master.cfg │ ├── index.rst │ ├── indices.rst │ ├── manual │ │ ├── _images │ │ │ ├── Makefile │ │ │ ├── badges-badgeio.png │ │ │ ├── changes.png │ │ │ ├── changes.svg │ │ │ ├── changes_src.svg │ │ │ ├── forcedialog1.png │ │ │ ├── icon.blend │ │ │ ├── master.png │ │ │ ├── master.svg │ │ │ ├── master.txt │ │ │ ├── master_src.svg │ │ │ ├── overview.png │ │ │ ├── overview.svg │ │ │ ├── overview.txt │ │ │ ├── overview_src.svg │ │ │ ├── vault_multipart_key.png │ │ │ ├── vault_simple_key.png │ │ │ ├── workers.png │ │ │ ├── workers.svg │ │ │ ├── workers.txt │ │ │ └── workers_src.svg │ │ ├── cmdline.rst │ │ ├── concepts.rst │ │ ├── configuration │ │ │ ├── builders.rst │ │ │ ├── buildfactories.rst │ │ │ ├── buildsets.rst │ │ │ ├── changesources.rst │ │ │ ├── configurators.rst │ │ │ ├── dbconfig.rst │ │ │ ├── global.rst │ │ │ ├── index.rst │ │ │ ├── interlocks.rst │ │ │ ├── intro.rst │ │ │ ├── manhole.rst │ │ │ ├── multicodebase.rst │ │ │ ├── multimaster.rst │ │ │ ├── properties.rst │ │ │ ├── report_generators │ │ │ │ ├── build.rst │ │ │ │ ├── build_start_end.rst │ │ │ │ ├── buildset.rst │ │ │ │ ├── formatter.rst │ │ │ │ ├── formatter_function.rst │ │ │ │ ├── formatter_missing_worker.rst │ │ │ │ ├── formatter_renderable.rst │ │ │ │ ├── index.rst │ │ │ │ └── worker.rst │ │ │ ├── reporters │ │ │ │ ├── bitbucket_server_core_api_status.rst │ │ │ │ ├── bitbucket_server_pr_comment_push.rst │ │ │ │ ├── bitbucket_server_status.rst │ │ │ │ ├── bitbucket_status.rst │ │ │ │ ├── gerrit_status.rst │ │ │ │ ├── gerrit_verify_status.rst │ │ │ │ ├── github_comment.rst │ │ │ │ ├── github_status.rst │ │ │ │ ├── gitlab_status.rst │ │ │ │ ├── hipchat_status.rst │ │ │ │ ├── http_status.rst │ │ │ │ ├── index.rst │ │ │ │ ├── irc.rst │ │ │ │ ├── mail_notifier.rst │ │ │ │ ├── pushjet_notifier.rst │ │ │ │ ├── pushover_notifier.rst │ │ │ │ ├── reporter_base.rst │ │ │ │ ├── telegram.rst │ │ │ │ └── zulip_status.rst │ │ │ ├── schedulers.rst │ │ │ ├── services.rst │ │ │ ├── steps │ │ │ │ ├── assert.rst │ │ │ │ ├── build_epydoc.rst │ │ │ │ ├── cmake.rst │ │ │ │ ├── common.rst │ │ │ │ ├── compile.rst │ │ │ │ ├── configure.rst │ │ │ │ ├── cppcheck.rst │ │ │ │ ├── deb_lintian.rst │ │ │ │ ├── deb_pbuilder.rst │ │ │ │ ├── file_transfer.rst │ │ │ │ ├── gitcommit.rst │ │ │ │ ├── gitpush.rst │ │ │ │ ├── gittag.rst │ │ │ │ ├── hlint.rst │ │ │ │ ├── http_step.rst │ │ │ │ ├── index.rst │ │ │ │ ├── log_renderable.rst │ │ │ │ ├── master_shell_command.rst │ │ │ │ ├── maxq.rst │ │ │ │ ├── mock_build_srpm.rst │ │ │ │ ├── mock_rebuild.rst │ │ │ │ ├── mtr.rst │ │ │ │ ├── perl_module_test.rst │ │ │ │ ├── pyflakes.rst │ │ │ │ ├── pylint.rst │ │ │ │ ├── remove_pycs.rst │ │ │ │ ├── robocopy.rst │ │ │ │ ├── rpm_build.rst │ │ │ │ ├── rpm_lint.rst │ │ │ │ ├── set_properties.rst │ │ │ │ ├── set_properties_from_env.rst │ │ │ │ ├── set_property.rst │ │ │ │ ├── set_property_from_command.rst │ │ │ │ ├── shell_command.rst │ │ │ │ ├── shell_sequence.rst │ │ │ │ ├── source_bzr.rst │ │ │ │ ├── source_common.rst │ │ │ │ ├── source_cvs.rst │ │ │ │ ├── source_darcs.rst │ │ │ │ ├── source_gerrit.rst │ │ │ │ ├── source_git.rst │ │ │ │ ├── source_github.rst │ │ │ │ ├── source_gitlab.rst │ │ │ │ ├── source_mercurial.rst │ │ │ │ ├── source_monotone.rst │ │ │ │ ├── source_p4.rst │ │ │ │ ├── source_repo.rst │ │ │ │ ├── source_svn.rst │ │ │ │ ├── sphinx.rst │ │ │ │ ├── subunit_shell_command.rst │ │ │ │ ├── test.rst │ │ │ │ ├── treesize.rst │ │ │ │ ├── trial.rst │ │ │ │ ├── trigger.rst │ │ │ │ ├── visual_cxx.rst │ │ │ │ └── worker_filesystem.rst │ │ │ ├── workers-docker.rst │ │ │ ├── workers-ec2.rst │ │ │ ├── workers-libvirt.rst │ │ │ ├── workers-openstack.rst │ │ │ ├── workers-upcloud.rst │ │ │ ├── workers.rst │ │ │ ├── www.rst │ │ │ └── wwwhooks.rst │ │ ├── customization.rst │ │ ├── deploy.rst │ │ ├── index.rst │ │ ├── installation │ │ │ ├── buildmaster.rst │ │ │ ├── components.rst │ │ │ ├── index.rst │ │ │ ├── installation.rst │ │ │ ├── misc.rst │ │ │ ├── requirements.rst │ │ │ └── worker.rst │ │ ├── introduction.rst │ │ ├── mydashboard.html │ │ ├── mydashboard.py │ │ ├── optimization.rst │ │ ├── plugins.rst │ │ ├── resources.rst │ │ ├── secretsmanagement.rst │ │ └── upgrading │ │ │ ├── 0.9-new-style-steps.rst │ │ │ ├── 0.9-upgrade.rst │ │ │ ├── 0.9-worker-transition.rst │ │ │ ├── 1.0-upgrade.rst │ │ │ ├── 2.0-upgrade.rst │ │ │ ├── 3.0-upgrade.rst │ │ │ └── index.rst │ ├── relnotes.rst.jinja │ ├── relnotes │ │ ├── 0.3.1.txt │ │ ├── 0.3.2.txt │ │ ├── 0.3.3.txt │ │ ├── 0.3.4.txt │ │ ├── 0.3.5.txt │ │ ├── 0.4.0.txt │ │ ├── 0.4.1.txt │ │ ├── 0.4.2.txt │ │ ├── 0.4.3.txt │ │ ├── 0.5.0.txt │ │ ├── 0.6.0.txt │ │ ├── 0.6.1.txt │ │ ├── 0.6.2.txt │ │ ├── 0.6.3.txt │ │ ├── 0.6.4.txt │ │ ├── 0.6.5.txt │ │ ├── 0.6.6.txt │ │ ├── 0.7.0.txt │ │ ├── 0.7.1.txt │ │ ├── 0.7.10.txt │ │ ├── 0.7.11.txt │ │ ├── 0.7.12.txt │ │ ├── 0.7.2.txt │ │ ├── 0.7.3.txt │ │ ├── 0.7.4.txt │ │ ├── 0.7.5.txt │ │ ├── 0.7.6.txt │ │ ├── 0.7.7.txt │ │ ├── 0.7.8.txt │ │ ├── 0.7.9.txt │ │ ├── 0.8.0.txt │ │ ├── 0.8.1.txt │ │ ├── 0.8.10.rst │ │ ├── 0.8.12.rst │ │ ├── 0.8.2.txt │ │ ├── 0.8.3.txt │ │ ├── 0.8.4.txt │ │ ├── 0.8.5.txt │ │ ├── 0.8.6.rst │ │ ├── 0.8.7.rst │ │ ├── 0.8.8.rst │ │ ├── 0.8.9.rst │ │ ├── 0.9.0.rst │ │ ├── 0.9.0b1.rst │ │ ├── 0.9.0b2.rst │ │ ├── 0.9.0b3.rst │ │ ├── 0.9.0b4.rst │ │ ├── 0.9.0b5.rst │ │ ├── 0.9.0b6.rst │ │ ├── 0.9.0b7.rst │ │ ├── 0.9.0b8.rst │ │ ├── 0.9.0b9.rst │ │ ├── 0.9.0rc1.rst │ │ ├── 0.9.0rc2.rst │ │ ├── 0.9.0rc3.rst │ │ ├── 0.9.0rc4.rst │ │ ├── 0.9.1.rst │ │ ├── 0.9.2-0.9.15.rst │ │ ├── 1.x.rst │ │ └── index.rst │ ├── spelling_wordlist.txt │ ├── templates │ │ └── raml.jinja │ └── tutorial │ │ ├── _images │ │ ├── builders.png │ │ ├── force-build.png │ │ ├── index.png │ │ ├── irc-testrun.png │ │ └── runtests-success.png │ │ ├── docker.rst │ │ ├── firstrun.rst │ │ ├── fiveminutes.rst │ │ ├── further.rst │ │ ├── index.rst │ │ └── tour.rst ├── requirements-docker-extras.txt ├── setup.cfg ├── setup.py └── tox.ini ├── pkg ├── README ├── buildbot_pkg.py ├── setup.cfg ├── setup.py └── test_buildbot_pkg.py ├── pyinstaller ├── buildbot-worker.py └── buildbot-worker.spec ├── pyproject.toml ├── readthedocs.yaml ├── requirements-ci.txt ├── requirements-cidb.txt ├── requirements-cidocs.txt ├── requirements-ciworker.txt ├── requirements-readthedocs.txt ├── smokes ├── e2e │ ├── about.scenarios.ts │ ├── buildsnavigation.scenarios.ts │ ├── dashboard.scenarios.ts │ ├── home.scenarios.ts │ ├── hook.scenarios.ts │ ├── pages │ │ ├── about.ts │ │ ├── base.ts │ │ ├── builder.ts │ │ ├── console.ts │ │ ├── dashboard.ts │ │ ├── force.ts │ │ ├── home.ts │ │ ├── pendingbuildrequests.ts │ │ ├── settings.ts │ │ ├── waterfall.ts │ │ └── worker.ts │ ├── pendingbuildrequests.scenarios.ts │ ├── reason_force.scenarios.ts │ ├── rebuilds.scenarios.ts │ ├── settings.scenarios.ts │ ├── utils.ts │ ├── waterfall.scenarios.ts │ └── worker.scenarios.ts ├── master.cfg ├── mydashboard.py ├── package.json ├── protractor-headless.conf.js ├── protractor.conf.js ├── run.sh ├── templates │ └── mydashboard.html ├── tsconfig.ee.json ├── tsconfig.json └── yarn.lock ├── worker ├── COPYING ├── Dockerfile ├── MANIFEST.in ├── Makefile ├── README ├── UPGRADING ├── buildbot_worker │ ├── __init__.py │ ├── backports │ │ └── __init__.py │ ├── base.py │ ├── bot.py │ ├── commands │ │ ├── __init__.py │ │ ├── base.py │ │ ├── fs.py │ │ ├── registry.py │ │ ├── shell.py │ │ ├── transfer.py │ │ └── utils.py │ ├── compat.py │ ├── exceptions.py │ ├── interfaces.py │ ├── invalid_utf8.bugfix │ ├── monkeypatches │ │ ├── __init__.py │ │ └── testcase_assert.py │ ├── null.py │ ├── pb.py │ ├── pbutil.py │ ├── runprocess.py │ ├── scripts │ │ ├── __init__.py │ │ ├── base.py │ │ ├── create_worker.py │ │ ├── logwatcher.py │ │ ├── restart.py │ │ ├── runner.py │ │ ├── start.py │ │ ├── stop.py │ │ └── windows_service.py │ ├── test │ │ ├── __init__.py │ │ ├── fake │ │ │ ├── __init__.py │ │ │ ├── remote.py │ │ │ ├── runprocess.py │ │ │ └── workerforbuilder.py │ │ ├── test_extra_coverage.py │ │ ├── test_util_hangcheck.py │ │ ├── unit │ │ │ ├── __init__.py │ │ │ ├── runprocess-scripts.py │ │ │ ├── test_bot.py │ │ │ ├── test_bot_Worker.py │ │ │ ├── test_commands_base.py │ │ │ ├── test_commands_fs.py │ │ │ ├── test_commands_registry.py │ │ │ ├── test_commands_shell.py │ │ │ ├── test_commands_transfer.py │ │ │ ├── test_commands_utils.py │ │ │ ├── test_runprocess.py │ │ │ ├── test_scripts_base.py │ │ │ ├── test_scripts_create_worker.py │ │ │ ├── test_scripts_restart.py │ │ │ ├── test_scripts_runner.py │ │ │ ├── test_scripts_start.py │ │ │ ├── test_scripts_stop.py │ │ │ └── test_util.py │ │ └── util │ │ │ ├── __init__.py │ │ │ ├── command.py │ │ │ ├── compat.py │ │ │ ├── misc.py │ │ │ └── sourcecommand.py │ └── util │ │ ├── __init__.py │ │ ├── _hangcheck.py │ │ └── _notifier.py ├── docker │ └── buildbot.tac ├── docs │ └── buildbot-worker.1 ├── setup.cfg ├── setup.py └── tox.ini └── www ├── README.txt ├── badges ├── buildbot_badges │ ├── __init__.py │ ├── static │ │ └── .placeholder │ └── templates │ │ ├── badgeio.svg.j2 │ │ ├── flat-square.svg.j2 │ │ ├── flat.svg.j2 │ │ └── plastic.svg.j2 ├── setup.cfg ├── setup.py └── yarn.lock ├── base ├── buildbot_www │ └── __init__.py ├── karma.conf.js ├── package.json ├── postcss.config.js ├── setup.cfg ├── setup.py ├── src │ ├── app │ │ ├── about │ │ │ ├── about.controller.js │ │ │ ├── about.route.js │ │ │ └── about.tpl.jade │ │ ├── app.browserwarning.notranspile.js │ │ ├── app.module.js │ │ ├── app.route.js │ │ ├── app.run.js │ │ ├── apps │ │ │ ├── app │ │ │ │ ├── app.controller.js │ │ │ │ ├── app.route.js │ │ │ │ └── app.tpl.jade │ │ │ ├── apps.controller.js │ │ │ ├── apps.route.js │ │ │ └── apps.tpl.jade │ │ ├── builders │ │ │ ├── builder │ │ │ │ ├── builder.controller.js │ │ │ │ ├── builder.route.js │ │ │ │ └── builder.tpl.jade │ │ │ ├── builders.controller.js │ │ │ ├── builders.route.js │ │ │ ├── builders.tpl.jade │ │ │ ├── buildrequest │ │ │ │ ├── buildrequest.controller.js │ │ │ │ ├── buildrequest.controller.spec.js │ │ │ │ ├── buildrequest.route.js │ │ │ │ ├── buildrequest.tpl.jade │ │ │ │ └── forcedialog │ │ │ │ │ ├── forcedialog.config.js │ │ │ │ │ ├── forcedialog.controller.js │ │ │ │ │ ├── forcedialog.spec.js │ │ │ │ │ └── forcedialog.tpl.jade │ │ │ ├── builds │ │ │ │ ├── build.controller.js │ │ │ │ ├── build.route.js │ │ │ │ └── build.tpl.jade │ │ │ ├── log │ │ │ │ ├── log.controller.js │ │ │ │ ├── log.route.js │ │ │ │ ├── log.tpl.jade │ │ │ │ └── logviewer │ │ │ │ │ ├── logpreview.directive.js │ │ │ │ │ ├── logpreview.less │ │ │ │ │ ├── logpreview.tpl.jade │ │ │ │ │ ├── logviewer.directive.js │ │ │ │ │ ├── logviewer.less │ │ │ │ │ ├── logviewer.tpl.jade │ │ │ │ │ ├── scrollviewport.directive.js │ │ │ │ │ └── scrollviewport.spec.js │ │ │ ├── services │ │ │ │ ├── findbuilds.factory.js │ │ │ │ └── timeout.factory.js │ │ │ └── step │ │ │ │ ├── step.controller.js │ │ │ │ ├── step.route.js │ │ │ │ └── step.tpl.jade │ │ ├── buildrequests │ │ │ ├── pendingbuildrequests.controller.js │ │ │ ├── pendingbuildrequests.route.js │ │ │ └── pendingbuildrequests.tpl.jade │ │ ├── changes │ │ │ ├── changebuilds │ │ │ │ ├── changebuilds.controller.js │ │ │ │ ├── changebuilds.route.js │ │ │ │ └── changebuilds.tpl.jade │ │ │ ├── changes.controller.js │ │ │ ├── changes.route.js │ │ │ └── changes.tpl.jade │ │ ├── common │ │ │ ├── common.constant.js │ │ │ ├── common.module.js │ │ │ ├── directives │ │ │ │ ├── basefield │ │ │ │ │ ├── basefield.directive.js │ │ │ │ │ └── basefield.tpl.jade │ │ │ │ ├── buildrequestsummary │ │ │ │ │ ├── buildrequestsummary.directive.js │ │ │ │ │ ├── buildrequestsummary.directive.spec.js │ │ │ │ │ └── buildrequestsummary.tpl.jade │ │ │ │ ├── builds │ │ │ │ │ ├── buildstable.directive.js │ │ │ │ │ └── buildstable.tpl.jade │ │ │ │ ├── buildsticker │ │ │ │ │ ├── buildsicker.less │ │ │ │ │ ├── buildsticker.directive.js │ │ │ │ │ ├── buildsticker.directive.spec.js │ │ │ │ │ └── buildsticker.tpl.jade │ │ │ │ ├── buildsummary │ │ │ │ │ ├── buildsummary.directive.js │ │ │ │ │ ├── buildsummary.directive.spec.js │ │ │ │ │ ├── buildsummary.tpl.jade │ │ │ │ │ └── buildsummarytooltip.tpl.jade │ │ │ │ ├── changedetails │ │ │ │ │ ├── changedetails.directive.js │ │ │ │ │ └── changedetails.tpl.jade │ │ │ │ ├── changelist │ │ │ │ │ ├── changelist.directive.js │ │ │ │ │ └── changelist.tpl.jade │ │ │ │ ├── connectionstatus │ │ │ │ │ ├── connectionstatus.directive.js │ │ │ │ │ ├── connectionstatus.less │ │ │ │ │ └── connectionstatus.tpl.jade │ │ │ │ ├── forcefields │ │ │ │ │ ├── boolfield.tpl.jade │ │ │ │ │ ├── filefield.tpl.jade │ │ │ │ │ ├── forcefields.directive.js │ │ │ │ │ ├── intfield.tpl.jade │ │ │ │ │ ├── listfield.tpl.jade │ │ │ │ │ ├── nestedfield.tpl.jade │ │ │ │ │ ├── simplelayout.tpl.jade │ │ │ │ │ ├── styles.less │ │ │ │ │ ├── tabslayout.tpl.jade │ │ │ │ │ ├── textareafield.tpl.jade │ │ │ │ │ ├── textfield.tpl.jade │ │ │ │ │ └── verticallayout.tpl.jade │ │ │ │ ├── lineplot │ │ │ │ │ ├── lineplot.directive.js │ │ │ │ │ ├── lineplot.tpl.jade │ │ │ │ │ └── styles.less │ │ │ │ ├── loginbar │ │ │ │ │ ├── loginbar.directive.js │ │ │ │ │ └── loginbar.tpl.jade │ │ │ │ ├── properties │ │ │ │ │ ├── properties.directive.js │ │ │ │ │ └── properties.tpl.jade │ │ │ │ ├── rawdata │ │ │ │ │ ├── rawdata.directive.js │ │ │ │ │ └── rawdata.tpl.jade │ │ │ │ └── windowtitle │ │ │ │ │ └── windowtitle.directive.js │ │ │ ├── filters │ │ │ │ ├── encodeURI.filter.js │ │ │ │ ├── limitStringLength.filter.js │ │ │ │ ├── moment │ │ │ │ │ ├── moment.constant.js │ │ │ │ │ └── moment.filter.js │ │ │ │ └── publicFields.filter.js │ │ │ └── services │ │ │ │ ├── ansicodes │ │ │ │ ├── ansicodes.service.js │ │ │ │ └── ansicodes.service.spec.js │ │ │ │ ├── buildercache │ │ │ │ └── buildercache.service.js │ │ │ │ ├── datagrouper │ │ │ │ └── datagrouper.service.js │ │ │ │ ├── favicon │ │ │ │ └── favicon.service.js │ │ │ │ ├── results │ │ │ │ ├── results.service.js │ │ │ │ └── results.service.spec.js │ │ │ │ └── settings │ │ │ │ ├── settings.service.js │ │ │ │ └── settings.service.spec.js │ │ ├── d3.module.js │ │ ├── d3 │ │ │ └── d3.service.js │ │ ├── home │ │ │ ├── home.controller.js │ │ │ ├── home.route.js │ │ │ └── home.tpl.jade │ │ ├── index.jade │ │ ├── layout.jade │ │ ├── masters │ │ │ ├── master │ │ │ │ └── master.route.js │ │ │ ├── masters.controller.js │ │ │ ├── masters.route.js │ │ │ └── masters.tpl.jade │ │ ├── schedulers │ │ │ ├── schedulers.controller.js │ │ │ ├── schedulers.route.js │ │ │ └── schedulers.tpl.jade │ │ ├── settings │ │ │ ├── settings.controller.js │ │ │ ├── settings.route.js │ │ │ └── settings.tpl.jade │ │ └── workers │ │ │ ├── worker │ │ │ └── worker.route.js │ │ │ ├── workeraction.dialog.js │ │ │ ├── workeractions.tpl.jade │ │ │ ├── workers.controller.js │ │ │ ├── workers.route.js │ │ │ └── workers.tpl.jade │ ├── icontestpage.html │ ├── img │ │ ├── favicon.ico │ │ ├── icon.png │ │ ├── icon.svg │ │ ├── icon16.svg │ │ └── nobody.png │ ├── styles │ │ ├── animations.less │ │ ├── colors.less │ │ ├── mobile.less │ │ └── styles.less │ └── tests.webpack.js ├── test │ └── scripts │ │ └── mocks │ │ └── config.mock.js ├── webpack.config.js └── yarn.lock ├── build_common ├── package.json ├── src │ ├── karma.js │ ├── main.module.js │ ├── ng-template-loader.js │ └── webpack.js └── yarn.lock ├── codeparameter ├── buildbot_codeparameter │ └── __init__.py ├── karma.conf.js ├── package.json ├── postcss.config.js ├── setup.cfg ├── setup.py ├── src │ ├── module │ │ ├── codefield.directive.js │ │ ├── codefield.tpl.jade │ │ ├── main.module.js │ │ └── main.module.spec.js │ ├── styles │ │ └── styles.less │ └── tests.webpack.js ├── webpack.config.js └── yarn.lock ├── console_view ├── buildbot_console_view │ └── __init__.py ├── karma.conf.js ├── package.json ├── postcss.config.js ├── setup.cfg ├── setup.py ├── src │ ├── module │ │ ├── builders.fixture.json │ │ ├── console.tpl.jade │ │ ├── main.module.js │ │ ├── main.module.spec.js │ │ └── view │ │ │ └── modal │ │ │ ├── modal.controller.js │ │ │ ├── modal.style.less │ │ │ └── modal.tpl.jade │ ├── styles │ │ └── styles.less │ └── tests.webpack.js ├── test │ └── main.js ├── webpack.config.js └── yarn.lock ├── data_module ├── README.md ├── karma.conf.js ├── package.json ├── postcss.config.js ├── src │ ├── classes │ │ ├── base.service.js │ │ ├── base.service.spec.js │ │ ├── build.service.js │ │ ├── builder.service.js │ │ ├── buildrequest.service.js │ │ ├── buildset.service.js │ │ ├── change.service.js │ │ ├── changes.spec.js │ │ ├── changesource.service.js │ │ ├── forcescheduler.service.js │ │ ├── logs.service.js │ │ ├── master.service.js │ │ ├── properties.service.js │ │ ├── scheduler.service.js │ │ ├── sourcestamp.service.js │ │ ├── step.service.js │ │ └── worker.service.js │ ├── data.constant.js │ ├── data.module.js │ ├── services │ │ ├── data │ │ │ ├── collection │ │ │ │ ├── collection.service.js │ │ │ │ ├── collection.service.spec.js │ │ │ │ ├── dataquery.service.js │ │ │ │ └── dataquery.service.spec.js │ │ │ ├── data.service.js │ │ │ └── data.service.spec.js │ │ ├── dataUtils │ │ │ ├── dataUtils.service.js │ │ │ └── dataUtils.service.spec.js │ │ ├── rest │ │ │ ├── rest.service.js │ │ │ └── rest.service.spec.js │ │ ├── socket │ │ │ ├── socket.service.js │ │ │ ├── socket.service.spec.js │ │ │ ├── webSocketBackend.service.js │ │ │ └── websocket.service.js │ │ └── stream │ │ │ ├── stream.service.js │ │ │ └── stream.service.spec.js │ └── tests.webpack.js ├── webpack.config.js └── yarn.lock ├── grid_view ├── buildbot_grid_view │ └── __init__.py ├── karma.conf.js ├── package.json ├── postcss.config.js ├── setup.cfg ├── setup.py ├── src │ ├── module │ │ ├── grid.controller.js │ │ ├── grid.tpl.jade │ │ ├── main.module.js │ │ └── main.module.spec.js │ ├── styles │ │ └── styles.less │ └── tests.webpack.js ├── test │ └── main.js ├── webpack.config.js └── yarn.lock ├── guanlecoja-ui ├── .travis.yml ├── LICENSE ├── Readme.md ├── karma.conf.js ├── package.json ├── postcss.config.js ├── src │ ├── app │ │ ├── index.jade │ │ └── layout.jade │ ├── img │ │ └── avatar.jpg │ ├── module │ │ ├── breadcrumb_service │ │ │ ├── breadcrumb.service.js │ │ │ └── breadcrumb.service.spec.js │ │ ├── main.module.js │ │ ├── menu_service │ │ │ ├── menu.service.js │ │ │ └── menu.service.spec.js │ │ ├── notification_service │ │ │ ├── httpinterceptor.js │ │ │ ├── httpinterceptor.spec.js │ │ │ ├── notification.service.js │ │ │ └── notification.service.spec.js │ │ ├── notification_widget │ │ │ ├── notification.directive.js │ │ │ ├── notification.less │ │ │ ├── notification.spec.js │ │ │ └── notification.tpl.jade │ │ ├── page_with_sidebar │ │ │ ├── page_with_sidebar.directive.js │ │ │ ├── page_with_sidebar.less │ │ │ ├── page_with_sidebar.spec.js │ │ │ └── page_with_sidebar.tpl.jade │ │ ├── topbar-contextual-actions │ │ │ ├── topbar-contextual-actions.directive.js │ │ │ ├── topbar-contextual-actions.less │ │ │ ├── topbar-contextual-actions.spec.js │ │ │ └── topbar-contextual-actions.tpl.jade │ │ └── topbar │ │ │ ├── topbar.directive.js │ │ │ ├── topbar.less │ │ │ ├── topbar.spec.js │ │ │ └── topbar.tpl.jade │ ├── styles │ │ └── styles.less │ └── tests.webpack.js ├── test │ └── main.js ├── webpack.config.js └── yarn.lock ├── nestedexample ├── README ├── buildbot_nestedexample │ ├── __init__.py │ └── api.py ├── guanlecoja │ └── config.js ├── gulpfile.js ├── package.json ├── setup.cfg ├── setup.py ├── src │ ├── module │ │ ├── nestedexamplefield.directive.js │ │ └── nestedexamplefield.tpl.jade │ └── styles │ │ └── styles.less └── yarn.lock ├── utils └── run-ng-classify.js ├── waterfall_view ├── buildbot_waterfall_view │ └── __init__.py ├── karma.conf.js ├── package.json ├── postcss.config.js ├── setup.cfg ├── setup.py ├── src │ ├── module │ │ ├── dataProcessor │ │ │ ├── dataProcessor.service.js │ │ │ └── dataProcessor.service.spec.js │ │ ├── main.module.js │ │ ├── main.module.spec.js │ │ ├── modal │ │ │ ├── modal.controller.js │ │ │ ├── modal.controller.spec.js │ │ │ ├── modal.style.less │ │ │ └── modal.tpl.jade │ │ ├── scale │ │ │ ├── scale.service.js │ │ │ └── scale.service.spec.js │ │ ├── waterfall.config.js │ │ ├── waterfall.route.js │ │ ├── waterfall.route.spec.js │ │ └── waterfall.tpl.jade │ ├── styles │ │ └── styles.less │ └── tests.webpack.js ├── test │ ├── d3 │ │ └── d3.service.js │ └── main.js ├── webpack.config.js └── yarn.lock └── wsgi_dashboards ├── buildbot_wsgi_dashboards └── __init__.py ├── karma.conf.js ├── package.json ├── postcss.config.js ├── setup.cfg ├── setup.py ├── src ├── module │ ├── dashboards.route.js │ ├── main.module.js │ └── main.module.spec.js ├── styles │ └── styles.less └── tests.webpack.js ├── webpack.config.js └── yarn.lock /.coveragerc: -------------------------------------------------------------------------------- 1 | common/coveragerc -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | ## Remove this paragraph 2 | 3 | If you don't remove this paragraph from the pull request description, this means you didn't read our contributor documentation, and your patch will need more back and forth before it can be accepted! 4 | 5 | Please have a look at our developer documentation before submitting your Pull Request. 6 | 7 | http://docs.buildbot.net/latest/developer/quickstart.html 8 | 9 | And especially: 10 | http://docs.buildbot.net/latest/developer/pull-request.html 11 | 12 | 13 | ## Contributor Checklist: 14 | 15 | * [ ] I have updated the unit tests 16 | * [ ] I have created a file in the `master/buildbot/newsfragments` directory (and read the `README.txt` in that directory) 17 | * [ ] I have updated the appropriate documentation 18 | -------------------------------------------------------------------------------- /.isort.cfg: -------------------------------------------------------------------------------- 1 | [settings] 2 | line_length=110 3 | known_future_library=__future__,future 4 | known_standard_library=pkg_resources,html 5 | known_twisted=twisted,zope,autobahn,klein,txaio 6 | known_mock=mock 7 | known_third_party=migrate,sqlalchemy,ldap3,txrequests,requests,MySQLdb,coverage,jinja2,dateutil,sphinx,setuptools,jwt,flask,docutils,aiohttp 8 | known_first_party=buildbot,buildbot_worker 9 | force_single_line=1 10 | sections=FUTURE,FUTURE_LIBRARY,STDLIB,THIRDPARTY,MOCK,TWISTED,FIRSTPARTY,LOCALFOLDER 11 | -------------------------------------------------------------------------------- /.mention-bot: -------------------------------------------------------------------------------- 1 | { 2 | "userBlacklist" : [ 3 | "tomprince", 4 | "djmitche" 5 | ] 6 | } 7 | -------------------------------------------------------------------------------- /.pyup.yml: -------------------------------------------------------------------------------- 1 | # update schedule, default is not set 2 | # the bot will visit the repo once and bundle all updates in a single PR for the given 3 | # day/week/month 4 | schedule: "every two weeks" # allowed ["every day", "every week", "every two weeks", "every month"] 5 | -------------------------------------------------------------------------------- /README.flathub.md: -------------------------------------------------------------------------------- 1 | This is a version of buildbot with changes applied to make it work 2 | for flathub. 3 | 4 | To hack on this, run once: 5 | 6 | ``` 7 | make virtualenv 8 | . .venv/bin/activate 9 | pip install psycopg2 10 | make frontend 11 | ``` 12 | 13 | When doing frontend work you can do that live with: 14 | 15 | ``` 16 | cd www/base 17 | yarn build 18 | ``` 19 | 20 | Then each time you can 21 | 22 | ``` 23 | . .venv/bin/activate 24 | cd $master-dir 25 | buildbot restart $master-dir 26 | ``` 27 | 28 | Releases are done with: 29 | 30 | ``` 31 | REL=...new release number.. 32 | git tag v2.7.0.flathub${REL} 33 | git push origin v2.7.0.flathub${REL} 34 | make tarballs 35 | ``` 36 | 37 | Then upload the files from dist/*.whl 38 | -------------------------------------------------------------------------------- /common/coveragerc: -------------------------------------------------------------------------------- 1 | [report] 2 | # Regexes for lines to exclude from consideration 3 | exclude_lines = 4 | # Have to re-enable the standard pragma 5 | pragma: no cover 6 | 7 | # Don't complain about missing debug-only code: 8 | def __repr__ 9 | if self\.debug 10 | 11 | # Don't complain if tests don't hit defensive assertion code: 12 | raise AssertionError 13 | raise NotImplementedError 14 | 15 | # Don't complain if non-runnable code isn't run: 16 | if 0: 17 | if __name__ == .__main__.: 18 | 19 | # 'pass' generally means 'this won't be called' 20 | ^ *pass *$ 21 | 22 | # conditionals on twisted versions aren't coverable 23 | if twisted.version 24 | 25 | include = 26 | master/* 27 | worker/* 28 | 29 | omit = 30 | # omit all of our tests 31 | common/* 32 | */test/* 33 | # templates cause coverage errors 34 | */templates/* 35 | master/buildbot/scripts/buildbot_tac.tmpl 36 | -------------------------------------------------------------------------------- /common/hooks/post-commit: -------------------------------------------------------------------------------- 1 | common/validate.sh HEAD~ --quick 2 | -------------------------------------------------------------------------------- /common/maketarball.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | pkg=$1 4 | ( 5 | cd ${pkg} 6 | rm -rf MANIFEST dist 7 | if [ ${pkg} == "master" ]; then 8 | python setup.py sdist 9 | # wheels must be build separately in order to properly omit tests 10 | python setup.py bdist_wheel 11 | else 12 | # retry once to workaround instabilities 13 | python setup.py sdist bdist_wheel || (git clean -xdf; python setup.py sdist bdist_wheel) 14 | fi 15 | ) 16 | cp ${pkg}/dist/* dist/ 17 | -------------------------------------------------------------------------------- /common/smokedist.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [ -z $1 ]; then 4 | suffixes="whl tar.gz" 5 | else 6 | suffixes=$1 7 | fi 8 | set -e 9 | for suffix in $suffixes 10 | do 11 | VE=sandbox.$suffix 12 | rm -rf $VE 13 | if [ -z "$python" ]; then 14 | virtualenv --python python3 $VE 15 | else 16 | virtualenv --python python$python $VE 17 | fi 18 | . $VE/bin/activate 19 | pip install -U pip 20 | pip install mock requests flask 21 | pip install dist/buildbot-2*.$suffix 22 | pip install dist/buildbot?pkg*.$suffix 23 | pip install dist/*.$suffix 24 | smokes/run.sh 25 | done 26 | -------------------------------------------------------------------------------- /master/.dockerignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | ./build 3 | _build 4 | node_modules 5 | docs/manual/mydashboard.html 6 | docs/manual/mydashboard.py 7 | -------------------------------------------------------------------------------- /master/Makefile: -------------------------------------------------------------------------------- 1 | # developer utilities 2 | pylint: 3 | pylint -j4 --rcfile=../common/pylintrc buildbot docs/*.py setup.py 4 | @test ! -f fail 5 | 6 | tutorial: 7 | cd docs/tutorial; $(MAKE) html 8 | flake8: 9 | flake8 --config=../common/flake8rc buildbot docs/*.py setup.py 10 | rmpyc: 11 | make -C .. rmpyc 12 | -------------------------------------------------------------------------------- /master/UPGRADING: -------------------------------------------------------------------------------- 1 | For information on ugprading Buildbot, see the section "Upgrading" in the buildbot documentation. 2 | 3 | This may be found locally in docs/manual/upgrading/index.rst. 4 | -------------------------------------------------------------------------------- /master/buildbot/buildrequest.py: -------------------------------------------------------------------------------- 1 | # This file is part of Buildbot. Buildbot is free software: you can 2 | # redistribute it and/or modify it under the terms of the GNU General Public 3 | # License as published by the Free Software Foundation, version 2. 4 | # 5 | # This program is distributed in the hope that it will be useful, but WITHOUT 6 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 7 | # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 8 | # details. 9 | # 10 | # You should have received a copy of the GNU General Public License along with 11 | # this program; if not, write to the Free Software Foundation, Inc., 51 12 | # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 13 | # 14 | # Copyright Buildbot Team Members 15 | 16 | from buildbot.process.buildrequest import BuildRequest 17 | 18 | _hush_pyflakes = [BuildRequest] 19 | -------------------------------------------------------------------------------- /master/buildbot/changes/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/buildbot/changes/__init__.py -------------------------------------------------------------------------------- /master/buildbot/changes/manager.py: -------------------------------------------------------------------------------- 1 | # This file is part of Buildbot. Buildbot is free software: you can 2 | # redistribute it and/or modify it under the terms of the GNU General Public 3 | # License as published by the Free Software Foundation, version 2. 4 | # 5 | # This program is distributed in the hope that it will be useful, but WITHOUT 6 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 7 | # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 8 | # details. 9 | # 10 | # You should have received a copy of the GNU General Public License along with 11 | # this program; if not, write to the Free Software Foundation, Inc., 51 12 | # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 13 | # 14 | # Copyright Buildbot Team Members 15 | 16 | 17 | from buildbot.process.measured_service import MeasuredBuildbotServiceManager 18 | 19 | 20 | class ChangeManager(MeasuredBuildbotServiceManager): 21 | name = "ChangeManager" 22 | managed_services_name = "changesources" 23 | config_attr = "change_sources" 24 | -------------------------------------------------------------------------------- /master/buildbot/clients/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/buildbot/clients/__init__.py -------------------------------------------------------------------------------- /master/buildbot/data/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/buildbot/data/__init__.py -------------------------------------------------------------------------------- /master/buildbot/db/__init__.py: -------------------------------------------------------------------------------- 1 | # This file is part of Buildbot. Buildbot is free software: you can 2 | # redistribute it and/or modify it under the terms of the GNU General Public 3 | # License as published by the Free Software Foundation, version 2. 4 | # 5 | # This program is distributed in the hope that it will be useful, but WITHOUT 6 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 7 | # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 8 | # details. 9 | # 10 | # You should have received a copy of the GNU General Public License along with 11 | # this program; if not, write to the Free Software Foundation, Inc., 51 12 | # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 13 | # 14 | # Copyright Buildbot Team Members 15 | 16 | # a NULL constant to use in sqlalchemy whereclauses e.g. (tbl.c.results == NULL) 17 | # so that pep8 is happy 18 | NULL = None 19 | -------------------------------------------------------------------------------- /master/buildbot/db/exceptions.py: -------------------------------------------------------------------------------- 1 | # This file is part of Buildbot. Buildbot is free software: you can 2 | # redistribute it and/or modify it under the terms of the GNU General Public 3 | # License as published by the Free Software Foundation, version 2. 4 | # 5 | # This program is distributed in the hope that it will be useful, but WITHOUT 6 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 7 | # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 8 | # details. 9 | # 10 | # You should have received a copy of the GNU General Public License along with 11 | # this program; if not, write to the Free Software Foundation, Inc., 51 12 | # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 13 | # 14 | # Copyright Buildbot Team Members 15 | 16 | 17 | class DatabaseNotReadyError(Exception): 18 | pass 19 | -------------------------------------------------------------------------------- /master/buildbot/db/migrate/README: -------------------------------------------------------------------------------- 1 | This is a database migration repository. 2 | 3 | More information at 4 | https://sqlalchemy-migrate.readthedocs.io/en/latest/ 5 | -------------------------------------------------------------------------------- /master/buildbot/db/migrate/versions/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/buildbot/db/migrate/versions/__init__.py -------------------------------------------------------------------------------- /master/buildbot/db/types/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/buildbot/db/types/__init__.py -------------------------------------------------------------------------------- /master/buildbot/errors.py: -------------------------------------------------------------------------------- 1 | # This file is part of Buildbot. Buildbot is free software: you can 2 | # redistribute it and/or modify it under the terms of the GNU General Public 3 | # License as published by the Free Software Foundation, version 2. 4 | # 5 | # This program is distributed in the hope that it will be useful, but WITHOUT 6 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 7 | # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 8 | # details. 9 | # 10 | # You should have received a copy of the GNU General Public License along with 11 | # this program; if not, write to the Free Software Foundation, Inc., 51 12 | # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 13 | # 14 | # Copyright Buildbot Team Members 15 | 16 | 17 | # Having them here prevents all kind of circular dependencies 18 | 19 | 20 | class PluginDBError(Exception): 21 | pass 22 | 23 | 24 | class CaptureCallbackError(Exception): 25 | pass 26 | -------------------------------------------------------------------------------- /master/buildbot/machine/__init__.py: -------------------------------------------------------------------------------- 1 | # This file is part of Buildbot. Buildbot is free software: you can 2 | # redistribute it and/or modify it under the terms of the GNU General Public 3 | # License as published by the Free Software Foundation, version 2. 4 | # 5 | # This program is distributed in the hope that it will be useful, but WITHOUT 6 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 7 | # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 8 | # details. 9 | # 10 | # You should have received a copy of the GNU General Public License along with 11 | # this program; if not, write to the Free Software Foundation, Inc., 51 12 | # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 13 | # 14 | # Copyright Buildbot Team Members 15 | -------------------------------------------------------------------------------- /master/buildbot/mq/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/buildbot/mq/__init__.py -------------------------------------------------------------------------------- /master/buildbot/newsfragments/README.txt: -------------------------------------------------------------------------------- 1 | This is the directory for news fragments used by towncrier: https://github.com/hawkowl/towncrier 2 | 3 | You create a news fragment in this directory when you make a change, and the file gets removed from this directory when the news is published. 4 | 5 | towncrier has a few standard types of news fragments, signified by the file extension. These are: 6 | 7 | .feature: Signifying a new feature. 8 | .bugfix: Signifying a bug fix. 9 | .doc: Signifying a documentation improvement. 10 | .removal: Signifying a deprecation or removal of public API. 11 | 12 | The core of the filename can be the fixed issue number of any unique text relative to your work. 13 | Buildbot project does not require a tracking ticket to be made for each contribution even if this is appreciated. 14 | 15 | Please point to the trac bug using syntax: (:bug:`NNN`) 16 | Please point to the github bug using syntax: (:issue:`NNN`) 17 | please point to classes using syntax: :py:class:`~buildbot.reporters.http.HttpStatusPushBase` 18 | -------------------------------------------------------------------------------- /master/buildbot/process/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/buildbot/process/__init__.py -------------------------------------------------------------------------------- /master/buildbot/process/base.py: -------------------------------------------------------------------------------- 1 | # This file is part of Buildbot. Buildbot is free software: you can 2 | # redistribute it and/or modify it under the terms of the GNU General Public 3 | # License as published by the Free Software Foundation, version 2. 4 | # 5 | # This program is distributed in the hope that it will be useful, but WITHOUT 6 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 7 | # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 8 | # details. 9 | # 10 | # You should have received a copy of the GNU General Public License along with 11 | # this program; if not, write to the Free Software Foundation, Inc., 51 12 | # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 13 | # 14 | # Copyright Buildbot Team Members 15 | 16 | 17 | from buildbot.process.build import Build 18 | 19 | _hush_pyflakes = [Build] 20 | -------------------------------------------------------------------------------- /master/buildbot/process/subunitlogobserver.py: -------------------------------------------------------------------------------- 1 | # This file is part of Buildbot. Buildbot is free software: you can 2 | # redistribute it and/or modify it under the terms of the GNU General Public 3 | # License as published by the Free Software Foundation, version 2. 4 | # 5 | # This program is distributed in the hope that it will be useful, but WITHOUT 6 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 7 | # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 8 | # details. 9 | # 10 | # You should have received a copy of the GNU General Public License along with 11 | # this program; if not, write to the Free Software Foundation, Inc., 51 12 | # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 13 | # 14 | # Copyright Buildbot Team Members 15 | 16 | 17 | # this used to be referenced here, so we keep a link for old time's sake 18 | import buildbot.steps.subunit 19 | 20 | SubunitShellCommand = buildbot.steps.subunit.SubunitShellCommand 21 | -------------------------------------------------------------------------------- /master/buildbot/process/users/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/buildbot/process/users/__init__.py -------------------------------------------------------------------------------- /master/buildbot/reporters/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/buildbot/reporters/__init__.py -------------------------------------------------------------------------------- /master/buildbot/reporters/generators/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/buildbot/reporters/generators/__init__.py -------------------------------------------------------------------------------- /master/buildbot/reporters/notifier.py: -------------------------------------------------------------------------------- 1 | # This file is part of Buildbot. Buildbot is free software: you can 2 | # redistribute it and/or modify it under the terms of the GNU General Public 3 | # License as published by the Free Software Foundation, version 2. 4 | # 5 | # This program is distributed in the hope that it will be useful, but WITHOUT 6 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 7 | # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 8 | # details. 9 | # 10 | # You should have received a copy of the GNU General Public License along with 11 | # this program; if not, write to the Free Software Foundation, Inc., 51 12 | # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 13 | # 14 | # Copyright Buildbot Team Members 15 | 16 | 17 | from buildbot.reporters.base import ReporterBase as NotifierBase 18 | 19 | _ignore_flake8 = [NotifierBase] 20 | -------------------------------------------------------------------------------- /master/buildbot/reporters/templates/default_mail.txt: -------------------------------------------------------------------------------- 1 | The Buildbot has detected a {{ status_detected }} on builder {{ buildername }} while building {{ projects }}. 2 | Full details are available at: 3 | {{ build_url }} 4 | 5 | Buildbot URL: {{ buildbot_url }} 6 | 7 | Worker for this Build: {{ workername }} 8 | 9 | Build Reason: {{ build['properties'].get('reason', [""])[0] }} 10 | Blamelist: {{ ", ".join(blamelist) }} 11 | 12 | {{ summary }} 13 | 14 | Sincerely, 15 | -The Buildbot 16 | -------------------------------------------------------------------------------- /master/buildbot/reporters/templates/default_notification.txt: -------------------------------------------------------------------------------- 1 | The Buildbot has detected a {{ status_detected }} of {{ buildername }} while building {{ projects }} on {{ workername }}. -------------------------------------------------------------------------------- /master/buildbot/reporters/templates/missing_mail.txt: -------------------------------------------------------------------------------- 1 | The Buildbot working for '{{buildbot_title}}' has noticed that the worker named {{worker.name}} went away. 2 | 3 | It last disconnected at {{worker.last_connection}}. 4 | 5 | {% if 'admin' in worker['workerinfo'] %} 6 | The admin on record (as reported by WORKER:info/admin) was {{worker.workerinfo.admin}}. 7 | {% endif %} 8 | 9 | Sincerely, 10 | -The Buildbot 11 | -------------------------------------------------------------------------------- /master/buildbot/reporters/templates/missing_notification.txt: -------------------------------------------------------------------------------- 1 | The Buildbot '{{buildbot_title}}' has noticed that the worker named {{worker.name}} went away. It last disconnected at {{worker.last_connection}}. -------------------------------------------------------------------------------- /master/buildbot/schedulers/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/buildbot/schedulers/__init__.py -------------------------------------------------------------------------------- /master/buildbot/schedulers/filter.py: -------------------------------------------------------------------------------- 1 | # This file is part of Buildbot. Buildbot is free software: you can 2 | # redistribute it and/or modify it under the terms of the GNU General Public 3 | # License as published by the Free Software Foundation, version 2. 4 | # 5 | # This program is distributed in the hope that it will be useful, but WITHOUT 6 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 7 | # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 8 | # details. 9 | # 10 | # You should have received a copy of the GNU General Public License along with 11 | # this program; if not, write to the Free Software Foundation, Inc., 51 12 | # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 13 | # 14 | # Copyright Buildbot Team Members 15 | 16 | 17 | # old (pre-0.8.4) location for ChangeFilter 18 | from buildbot.changes.filter import ChangeFilter 19 | 20 | _hush_pyflakes = ChangeFilter # keep pyflakes happy 21 | -------------------------------------------------------------------------------- /master/buildbot/schedulers/manager.py: -------------------------------------------------------------------------------- 1 | # This file is part of Buildbot. Buildbot is free software: you can 2 | # redistribute it and/or modify it under the terms of the GNU General Public 3 | # License as published by the Free Software Foundation, version 2. 4 | # 5 | # This program is distributed in the hope that it will be useful, but WITHOUT 6 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 7 | # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 8 | # details. 9 | # 10 | # You should have received a copy of the GNU General Public License along with 11 | # this program; if not, write to the Free Software Foundation, Inc., 51 12 | # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 13 | # 14 | # Copyright Buildbot Team Members 15 | 16 | 17 | from buildbot.process.measured_service import MeasuredBuildbotServiceManager 18 | 19 | 20 | class SchedulerManager(MeasuredBuildbotServiceManager): 21 | name = "SchedulerManager" 22 | managed_services_name = "schedulers" 23 | config_attr = "schedulers" 24 | -------------------------------------------------------------------------------- /master/buildbot/scripts/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/buildbot/scripts/__init__.py -------------------------------------------------------------------------------- /master/buildbot/scripts/flathub-cleanup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | shopt -s nullglob 4 | 5 | echo Free space on build disk: 6 | df -h . 7 | 8 | rm -frv ~/.cache/flatpak 9 | rm -frv ~/.local/share/flatpak/repo/tmp/cache 10 | 11 | du -csh ../../* 12 | for i in ../../build-*; do 13 | if test -d $i; then 14 | pushd $i 15 | echo Scanning `basename $i` 16 | du -ha -d2 17 | for i in */.flatpak-builder/rofiles/rofiles-*; do 18 | fusermount -u -z $i || true 19 | done 20 | find -mindepth 1 -maxdepth 1 -type d -print0 | xargs -0t rm -rf 21 | popd 22 | fi 23 | done 24 | 25 | echo Free space on build disk: 26 | df -h . 27 | -------------------------------------------------------------------------------- /master/buildbot/scripts/flathub-merge-sources.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | shopt -s nullglob 5 | 6 | SOURCEDIR="$1" 7 | mkdir -p $SOURCEDIR/downloads 8 | 9 | if test -d .flatpak-builder/downloads/; then 10 | cp -rnv .flatpak-builder/downloads $SOURCEDIR 11 | fi 12 | 13 | for vcs in git bzr svn; do 14 | mkdir -p $SOURCEDIR/$vcs 15 | for repo in .flatpak-builder/git/*; do 16 | mv -nvT $repo $SOURCEDIR/$vcs/`basename $repo` 17 | done 18 | done 19 | -------------------------------------------------------------------------------- /master/buildbot/scripts/trycmd.py: -------------------------------------------------------------------------------- 1 | # This file is part of Buildbot. Buildbot is free software: you can 2 | # redistribute it and/or modify it under the terms of the GNU General Public 3 | # License as published by the Free Software Foundation, version 2. 4 | # 5 | # This program is distributed in the hope that it will be useful, but WITHOUT 6 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 7 | # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 8 | # details. 9 | # 10 | # You should have received a copy of the GNU General Public License along with 11 | # this program; if not, write to the Free Software Foundation, Inc., 51 12 | # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 13 | # 14 | # Copyright Buildbot Team Members 15 | 16 | 17 | def trycmd(config): 18 | from buildbot.clients import tryclient 19 | t = tryclient.Try(config) 20 | t.run() 21 | return 0 22 | -------------------------------------------------------------------------------- /master/buildbot/secrets/__init__.py: -------------------------------------------------------------------------------- 1 | # This file is part of Buildbot. Buildbot is free software: you can 2 | # redistribute it and/or modify it under the terms of the GNU General Public 3 | # License as published by the Free Software Foundation, version 2. 4 | # 5 | # This program is distributed in the hope that it will be useful, but WITHOUT 6 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 7 | # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 8 | # details. 9 | # 10 | # You should have received a copy of the GNU General Public License along with 11 | # this program; if not, write to the Free Software Foundation, Inc., 51 12 | # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 13 | # 14 | # Copyright Buildbot Team Members 15 | -------------------------------------------------------------------------------- /master/buildbot/secrets/providers/__init__.py: -------------------------------------------------------------------------------- 1 | # This file is part of Buildbot. Buildbot is free software: you can 2 | # redistribute it and/or modify it under the terms of the GNU General Public 3 | # License as published by the Free Software Foundation, version 2. 4 | # 5 | # This program is distributed in the hope that it will be useful, but WITHOUT 6 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 7 | # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 8 | # details. 9 | # 10 | # You should have received a copy of the GNU General Public License along with 11 | # this program; if not, write to the Free Software Foundation, Inc., 51 12 | # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 13 | # 14 | # Copyright Buildbot Team Members 15 | -------------------------------------------------------------------------------- /master/buildbot/spec/indent.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | 3 | 4 | import re 5 | import sys 6 | 7 | spaces = re.compile("^ +") 8 | for fn in sys.argv[1:]: 9 | lines = [] 10 | with open(fn, 'r') as f: 11 | for line in f: 12 | lines.append(line) 13 | 14 | def getIndent(i): 15 | res = spaces.match(lines[i]) 16 | if res is None: 17 | return 0 18 | return len(res.group(0)) 19 | 20 | def IndentBlock(i, numspaces): 21 | initIndent = getIndent(i) 22 | while i < len(lines) and initIndent <= getIndent(i): 23 | lines[i] = " " * numspaces + lines[i] 24 | i += 1 25 | 26 | for i, line in enumerate(lines): 27 | missingIndent = 4 - (getIndent(i) % 4) 28 | if missingIndent != 4: 29 | IndentBlock(i, missingIndent) 30 | 31 | with open(fn, 'w') as f: 32 | for line in lines: 33 | f.write(line) 34 | -------------------------------------------------------------------------------- /master/buildbot/spec/types/forcescheduler.raml: -------------------------------------------------------------------------------- 1 | #%RAML 1.0 DataType 2 | description: | 3 | 4 | A forcescheduler initiates builds, via a formular in the web UI. 5 | At the moment, forceschedulers must be defined on all the masters where a web ui is configured. A particular forcescheduler runs on the master where the web request was sent. 6 | 7 | .. note:: 8 | 9 | This datatype and associated endpoints will be deprecated when :bug:`2673` will be resolved. 10 | 11 | properties: 12 | all_fields[]: 13 | description: '' 14 | type: object 15 | builder_names[]: 16 | description: names of the builders that this scheduler can trigger 17 | type: identifier 18 | button_name: 19 | description: label of the button to use in the UI 20 | type: string 21 | label: 22 | description: label of this scheduler to be displayed in the ui 23 | type: string 24 | name: 25 | description: name of this scheduler 26 | type: identifier 27 | type: object 28 | -------------------------------------------------------------------------------- /master/buildbot/spec/types/identifier.raml: -------------------------------------------------------------------------------- 1 | #%RAML 1.0 DataType 2 | pattern: ^[a-zA-Z_-][a-zA-Z0-9_-]*$ 3 | type: string 4 | -------------------------------------------------------------------------------- /master/buildbot/spec/types/rootlink.raml: -------------------------------------------------------------------------------- 1 | #%RAML 1.0 DataType 2 | properties: 3 | name: 4 | description: '' 5 | type: string 6 | type: object 7 | -------------------------------------------------------------------------------- /master/buildbot/spec/types/spec.raml: -------------------------------------------------------------------------------- 1 | #%RAML 1.0 DataType 2 | properties: 3 | path: 4 | description: '' 5 | type: string 6 | plural: 7 | description: '' 8 | type: string 9 | type: 10 | description: '' 11 | type: string 12 | type_spec: 13 | description: '' 14 | type: object 15 | type: object 16 | -------------------------------------------------------------------------------- /master/buildbot/statistics/storage_backends/__init__.py: -------------------------------------------------------------------------------- 1 | # This file is part of Buildbot. Buildbot is free software: you can 2 | # redistribute it and/or modify it under the terms of the GNU General Public 3 | # License as published by the Free Software Foundation, version 2. 4 | # 5 | # This program is distributed in the hope that it will be useful, but WITHOUT 6 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 7 | # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 8 | # details. 9 | # 10 | # You should have received a copy of the GNU General Public License along with 11 | # this program; if not, write to the Free Software Foundation, Inc., 51 12 | # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 13 | # 14 | # Copyright Buildbot Team Members 15 | -------------------------------------------------------------------------------- /master/buildbot/status/__init__.py: -------------------------------------------------------------------------------- 1 | from buildbot.status import build_compat 2 | from buildbot.status import builder_compat 3 | from buildbot.status import buildrequest_compat 4 | from buildbot.status import buildset_compat 5 | from buildbot.status import master_compat 6 | 7 | # styles.Versioned requires this, as it keys the version numbers on the fully 8 | # qualified class name; see master/buildbot/test/regressions/test_unpickling.py 9 | build_compat.BuildStatus.__module__ = 'buildbot.status.builder' 10 | 11 | # add all of these classes to builder; this is a form of late binding to allow 12 | # circular module references among the status modules 13 | builder_compat.BuildSetStatus = buildset_compat.BuildSetStatus 14 | builder_compat.Status = master_compat.Status 15 | builder_compat.BuildStatus = build_compat.BuildStatus 16 | builder_compat.BuildRequestStatus = buildrequest_compat.BuildRequestStatus 17 | -------------------------------------------------------------------------------- /master/buildbot/status/web/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/buildbot/status/web/__init__.py -------------------------------------------------------------------------------- /master/buildbot/steps/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/buildbot/steps/__init__.py -------------------------------------------------------------------------------- /master/buildbot/steps/package/__init__.py: -------------------------------------------------------------------------------- 1 | # This file is part of Buildbot. Buildbot is free software: you can 2 | # redistribute it and/or modify it under the terms of the GNU General Public 3 | # License as published by the Free Software Foundation, version 2. 4 | # 5 | # This program is distributed in the hope that it will be useful, but WITHOUT 6 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 7 | # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 8 | # details. 9 | # 10 | # You should have received a copy of the GNU General Public License along with 11 | # this program; if not, write to the Free Software Foundation, Inc., 51 12 | # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 13 | # 14 | # Portions Copyright Buildbot Team Members 15 | # Portions Copyright Steve 'Ashcrow' Milner 16 | """ 17 | Steps specific to package formats. 18 | """ 19 | -------------------------------------------------------------------------------- /master/buildbot/steps/package/deb/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/buildbot/steps/package/deb/__init__.py -------------------------------------------------------------------------------- /master/buildbot/steps/source/__init__.py: -------------------------------------------------------------------------------- 1 | # This file is part of Buildbot. Buildbot is free software: you can 2 | # redistribute it and/or modify it under the terms of the GNU General Public 3 | # License as published by the Free Software Foundation, version 2. 4 | # 5 | # This program is distributed in the hope that it will be useful, but WITHOUT 6 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 7 | # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 8 | # details. 9 | # 10 | # You should have received a copy of the GNU General Public License along with 11 | # this program; if not, write to the Free Software Foundation, Inc., 51 12 | # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 13 | # 14 | # Copyright Buildbot Team Members 15 | 16 | from buildbot.steps.source.base import Source 17 | 18 | _hush_pyflakes = [Source] 19 | -------------------------------------------------------------------------------- /master/buildbot/test/fake/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/buildbot/test/fake/__init__.py -------------------------------------------------------------------------------- /master/buildbot/test/fake/secrets.py: -------------------------------------------------------------------------------- 1 | 2 | from buildbot.secrets.providers.base import SecretProviderBase 3 | 4 | 5 | class FakeSecretStorage(SecretProviderBase): 6 | 7 | name = "SecretsInFake" 8 | 9 | def reconfigService(self, secretdict=None): 10 | if secretdict is None: 11 | secretdict = {} 12 | self.allsecrets = secretdict 13 | 14 | def get(self, key): 15 | if key in self.allsecrets: 16 | return self.allsecrets[key] 17 | return None 18 | -------------------------------------------------------------------------------- /master/buildbot/test/fuzz/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/buildbot/test/fuzz/__init__.py -------------------------------------------------------------------------------- /master/buildbot/test/integration/README.txt: -------------------------------------------------------------------------------- 1 | "Integration" tests are tests that exercise a significant chunk of the 2 | Buildbot code, and thus do not really count as unit tests. 3 | 4 | When debugging, get the unit tests working first, *then* work on the 5 | integration tests. 6 | -------------------------------------------------------------------------------- /master/buildbot/test/integration/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/buildbot/test/integration/__init__.py -------------------------------------------------------------------------------- /master/buildbot/test/integration/interop/__init__.py: -------------------------------------------------------------------------------- 1 | # This file is part of Buildbot. Buildbot is free software: you can 2 | # redistribute it and/or modify it under the terms of the GNU General Public 3 | # License as published by the Free Software Foundation, version 2. 4 | # 5 | # This program is distributed in the hope that it will be useful, but WITHOUT 6 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 7 | # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 8 | # details. 9 | # 10 | # You should have received a copy of the GNU General Public License along with 11 | # this program; if not, write to the Free Software Foundation, Inc., 51 12 | # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 13 | # 14 | # Copyright Buildbot Team Members 15 | 16 | """Tests in this module are meant to be used for interoperability 17 | between different version of worker vs master (e.g py2 vs py3) 18 | """ 19 | -------------------------------------------------------------------------------- /master/buildbot/test/integration/v087p1-README.txt: -------------------------------------------------------------------------------- 1 | -- Basic v0.8.7p1 tarball -- 2 | 3 | This tarball is the result of a couple of runs from a single 4 | incarnation of a master that was running Buildbot-0.8.7p1. Both 5 | builds were successful. 6 | -------------------------------------------------------------------------------- /master/buildbot/test/integration/v087p1.tgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/buildbot/test/integration/v087p1.tgz -------------------------------------------------------------------------------- /master/buildbot/test/integration/v090b4-README.txt: -------------------------------------------------------------------------------- 1 | -- Basic v0.9.0b4 tarball -- 2 | 3 | This tarball is the result of a couple of runs from a single 4 | incarnation of a master that was running Buildbot-0.9.0b4. Both 5 | builds were successful. 6 | -------------------------------------------------------------------------------- /master/buildbot/test/integration/v090b4.tgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/buildbot/test/integration/v090b4.tgz -------------------------------------------------------------------------------- /master/buildbot/test/regressions/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/buildbot/test/regressions/__init__.py -------------------------------------------------------------------------------- /master/buildbot/test/unit/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/buildbot/test/unit/__init__.py -------------------------------------------------------------------------------- /master/buildbot/test/unit/changes/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/buildbot/test/unit/changes/__init__.py -------------------------------------------------------------------------------- /master/buildbot/test/unit/data/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/buildbot/test/unit/data/__init__.py -------------------------------------------------------------------------------- /master/buildbot/test/unit/db/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/buildbot/test/unit/db/__init__.py -------------------------------------------------------------------------------- /master/buildbot/test/unit/db_migrate/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/buildbot/test/unit/db_migrate/__init__.py -------------------------------------------------------------------------------- /master/buildbot/test/unit/process/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/buildbot/test/unit/process/__init__.py -------------------------------------------------------------------------------- /master/buildbot/test/unit/reporters/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/buildbot/test/unit/reporters/__init__.py -------------------------------------------------------------------------------- /master/buildbot/test/unit/schedulers/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/buildbot/test/unit/schedulers/__init__.py -------------------------------------------------------------------------------- /master/buildbot/test/unit/scripts/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/buildbot/test/unit/scripts/__init__.py -------------------------------------------------------------------------------- /master/buildbot/test/unit/steps/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/buildbot/test/unit/steps/__init__.py -------------------------------------------------------------------------------- /master/buildbot/test/unit/test_templates_dir/builds.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | -------------------------------------------------------------------------------- /master/buildbot/test/unit/test_templates_dir/plugin/plugin.jade: -------------------------------------------------------------------------------- 1 | .myclass 2 | pre 3 | | this is customized 4 | -------------------------------------------------------------------------------- /master/buildbot/test/unit/util/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/buildbot/test/unit/util/__init__.py -------------------------------------------------------------------------------- /master/buildbot/test/unit/util/test_sautils.py: -------------------------------------------------------------------------------- 1 | # This file is part of Buildbot. Buildbot is free software: you can 2 | # redistribute it and/or modify it under the terms of the GNU General Public 3 | # License as published by the Free Software Foundation, version 2. 4 | # 5 | # This program is distributed in the hope that it will be useful, but WITHOUT 6 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 7 | # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 8 | # details. 9 | # 10 | # You should have received a copy of the GNU General Public License along with 11 | # this program; if not, write to the Free Software Foundation, Inc., 51 12 | # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 13 | # 14 | # Copyright Buildbot Team Members 15 | 16 | 17 | from twisted.trial import unittest 18 | 19 | from buildbot.util import sautils 20 | 21 | 22 | class SAVersion(unittest.TestCase): 23 | 24 | def test_sa_version(self): 25 | self.assertTrue(sautils.sa_version() > (0, 5, 0)) 26 | -------------------------------------------------------------------------------- /master/buildbot/test/unit/worker/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/buildbot/test/unit/worker/__init__.py -------------------------------------------------------------------------------- /master/buildbot/test/unit/www/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/buildbot/test/unit/www/__init__.py -------------------------------------------------------------------------------- /master/buildbot/test/util/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/buildbot/test/util/__init__.py -------------------------------------------------------------------------------- /master/buildbot/util/tuplematch.py: -------------------------------------------------------------------------------- 1 | # This file is part of Buildbot. Buildbot is free software: you can 2 | # redistribute it and/or modify it under the terms of the GNU General Public 3 | # License as published by the Free Software Foundation, version 2. 4 | # 5 | # This program is distributed in the hope that it will be useful, but WITHOUT 6 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 7 | # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 8 | # details. 9 | # 10 | # You should have received a copy of the GNU General Public License along with 11 | # this program; if not, write to the Free Software Foundation, Inc., 51 12 | # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 13 | # 14 | # Copyright Buildbot Team Members 15 | 16 | 17 | def matchTuple(routingKey, filter): 18 | if len(filter) != len(routingKey): 19 | return False 20 | for k, f in zip(routingKey, filter): 21 | if f is not None and f != k: 22 | return False 23 | return True 24 | -------------------------------------------------------------------------------- /master/buildbot/wamp/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/buildbot/wamp/__init__.py -------------------------------------------------------------------------------- /master/buildbot/worker/__init__.py: -------------------------------------------------------------------------------- 1 | # This file is part of Buildbot. Buildbot is free software: you can 2 | # redistribute it and/or modify it under the terms of the GNU General Public 3 | # License as published by the Free Software Foundation, version 2. 4 | # 5 | # This program is distributed in the hope that it will be useful, but WITHOUT 6 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 7 | # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 8 | # details. 9 | # 10 | # You should have received a copy of the GNU General Public License along with 11 | # this program; if not, write to the Free Software Foundation, Inc., 51 12 | # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 13 | # 14 | # Copyright Buildbot Team Members 15 | 16 | from buildbot.worker.base import AbstractWorker 17 | from buildbot.worker.base import Worker 18 | from buildbot.worker.latent import AbstractLatentWorker 19 | 20 | _hush_pyflakes = [ 21 | AbstractWorker, 22 | Worker, 23 | AbstractLatentWorker, 24 | ] 25 | -------------------------------------------------------------------------------- /master/buildbot/worker/protocols/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/buildbot/worker/protocols/__init__.py -------------------------------------------------------------------------------- /master/buildbot/www/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/buildbot/www/__init__.py -------------------------------------------------------------------------------- /master/buildbot/www/authz/__init__.py: -------------------------------------------------------------------------------- 1 | from buildbot.www.authz.authz import Authz 2 | from buildbot.www.authz.authz import Forbidden 3 | from buildbot.www.authz.authz import fnmatchStrMatcher 4 | from buildbot.www.authz.authz import reStrMatcher 5 | 6 | __all__ = ["Authz", "fnmatchStrMatcher", "reStrMatcher", "Forbidden"] 7 | -------------------------------------------------------------------------------- /master/buildbot/www/hooks/__init__.py: -------------------------------------------------------------------------------- 1 | # test 2 | -------------------------------------------------------------------------------- /master/docker/README.md: -------------------------------------------------------------------------------- 1 | Buildbot-Master docker container 2 | ================================ 3 | 4 | [Buildbot](http://buildbot.net) is a continuous integration framework written and configured in python. 5 | 6 | You can look at the [tutorial](http://docs.buildbot.net/latest/tutorial/docker.html) to learn how to use it. 7 | 8 | This container is based on alpine linux, and thus very lightweight. Another version based on ubuntu exists if you need more custom environment. 9 | 10 | The container expects a /var/lib/buildbot volume to store its configuration, and will open port 8010 for web server, and 9989 for worker connection. 11 | It is also expecting a postgresql container attached for storing state. 12 | -------------------------------------------------------------------------------- /master/docker/buildbot.tac: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | 4 | from twisted.application import service 5 | from twisted.python.log import FileLogObserver 6 | from twisted.python.log import ILogObserver 7 | 8 | from buildbot.master import BuildMaster 9 | 10 | basedir = os.environ.get("BUILDBOT_BASEDIR", 11 | os.path.abspath(os.path.dirname(__file__))) 12 | configfile = 'master.cfg' 13 | 14 | # note: this line is matched against to check that this is a buildmaster 15 | # directory; do not edit it. 16 | application = service.Application('buildmaster') 17 | application.setComponent(ILogObserver, FileLogObserver(sys.stdout).emit) 18 | 19 | m = BuildMaster(basedir, configfile, umask=None) 20 | m.setServiceParent(application) 21 | -------------------------------------------------------------------------------- /master/docs/_images/full_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/docs/_images/full_logo.png -------------------------------------------------------------------------------- /master/docs/_images/header-text-transparent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/docs/_images/header-text-transparent.png -------------------------------------------------------------------------------- /master/docs/_images/success_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/docs/_images/success_normal.png -------------------------------------------------------------------------------- /master/docs/_static/buildbot_rtd.css: -------------------------------------------------------------------------------- 1 | 2 | /* The RTD default uses a lot of horizontal space for the "Parameters" heading which is placed 3 | to a separate column. The descriptions of parameters are often very long in Buildbot, so 4 | just some indentation is fine 5 | */ 6 | 7 | html.writer-html5 .rst-content dl.field-list { 8 | display: initial; 9 | } 10 | 11 | html.writer-html5 .rst-content dl.field-list dt { 12 | padding-left: 0; 13 | } 14 | 15 | html.writer-html5 .rst-content dl.field-list dd { 16 | margin-left: 0; 17 | } 18 | 19 | /* The left and right padding for the contents seems excessive 20 | */ 21 | 22 | .wy-nav-content { 23 | /* the values used are the same as for top and bottom padding */ 24 | padding-right: 1.618em; 25 | padding-left: 1.618em; 26 | } 27 | -------------------------------------------------------------------------------- /master/docs/_static/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/docs/_static/icon.png -------------------------------------------------------------------------------- /master/docs/_templates/localtoc.html: -------------------------------------------------------------------------------- 1 |

{{ _('Table Of Contents') }}

2 | {{ toctree(collapse=True, maxdepth=-1, titles_only=True) }} 3 | -------------------------------------------------------------------------------- /master/docs/bbdocs/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/docs/bbdocs/__init__.py -------------------------------------------------------------------------------- /master/docs/bbdocs/test/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/docs/bbdocs/test/__init__.py -------------------------------------------------------------------------------- /master/docs/developer/_images/stats-service.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/docs/developer/_images/stats-service.png -------------------------------------------------------------------------------- /master/docs/developer/classes.rst: -------------------------------------------------------------------------------- 1 | Classes 2 | ======= 3 | 4 | The sections contained here document classes that can be used or subclassed. 5 | 6 | .. note:: 7 | 8 | Some of this information duplicates information available in the source code itself. 9 | Consider this information authoritative, and the source code a demonstration of the current implementation which is subject to change. 10 | 11 | .. toctree:: 12 | :maxdepth: 1 13 | 14 | cls-build 15 | cls-worker 16 | cls-buildfactory 17 | cls-buildsetsummarynotifiermixin 18 | cls-changesources 19 | cls-remotecommands 20 | cls-buildsteps 21 | cls-basescheduler 22 | cls-forcesched 23 | cls-irenderable 24 | cls-iproperties 25 | cls-iconfigurator 26 | cls-resultspec 27 | cls-protocols 28 | cls-workermanager 29 | cls-log 30 | cls-logobserver 31 | cls-auth 32 | cls-avatar 33 | cls-www 34 | -------------------------------------------------------------------------------- /master/docs/developer/cls-avatar.rst: -------------------------------------------------------------------------------- 1 | Avatars 2 | ======= 3 | 4 | Buildbot's avatar support associate a small image with each user. 5 | 6 | .. py:module:: buildbot.www.avatar 7 | 8 | .. py:class:: AvatarBase 9 | 10 | Class that can be used, to get more the avatars for the users. 11 | This can be used for the authenticated users, but also for the users referenced by changes. 12 | 13 | .. py:method:: getUserAvatar(self, email, size, defaultAvatarUrl) 14 | 15 | returns the user's avatar, from the user's email (via deferred). 16 | If the data is directly available, this function returns a tuple ``(mime_type, picture_raw_data)``. 17 | If the data is available in another URL, this function can raise ``resource.Redirect(avatar_url)``, and the web server will redirect to the avatar_url. 18 | -------------------------------------------------------------------------------- /master/docs/developer/cls-iconfigurator.rst: -------------------------------------------------------------------------------- 1 | .. index:: single: Configurator; IConfigurator 2 | 3 | ``IConfigurator`` 4 | ================= 5 | 6 | .. class:: buildbot.interfaces.IConfigurator:: 7 | 8 | A configurator is an object which configures several components of Buildbot in a coherent manner. 9 | This can be used to implement higher level configuration tools. 10 | 11 | .. method:: configure(config_dict) 12 | 13 | Alter the buildbot ``config_dict``, as defined in master.cfg 14 | 15 | like the master.cfg, this is run out of the main reactor thread, so this can block, but this can't 16 | call most Buildbot facilities. 17 | -------------------------------------------------------------------------------- /master/docs/developer/cls-iproperties.rst: -------------------------------------------------------------------------------- 1 | .. index:: single: Properties; IProperties 2 | 3 | IProperties 4 | =========== 5 | 6 | .. class:: buildbot.interfaces.IProperties:: 7 | 8 | Providers of this interface allow get and set access to a build's properties. 9 | 10 | .. method:: getProperty(propname, default=None) 11 | 12 | Get a named property, returning the default value if the property is not found. 13 | 14 | .. method:: hasProperty(propname) 15 | 16 | Determine whether the named property exists. 17 | 18 | .. method:: setProperty(propname, value, source) 19 | 20 | Set a property's value, also specifying the source for this value. 21 | 22 | .. method:: getProperties() 23 | 24 | Get a :class:`buildbot.process.properties.Properties` instance. 25 | The interface of this class is not finalized; where possible, use the other ``IProperties`` methods. 26 | -------------------------------------------------------------------------------- /master/docs/developer/cls-irenderable.rst: -------------------------------------------------------------------------------- 1 | .. index:: single: Properties; IRenderable 2 | 3 | IRenderable 4 | =========== 5 | 6 | .. class:: buildbot.interfaces.IRenderable:: 7 | 8 | Providers of this class can be "rendered", based on available properties, when a build is started. 9 | 10 | .. method:: getRenderingFor(iprops) 11 | 12 | :param iprops: the :class:`~buildbot.interfaces.IProperties` provider supplying the properties of the build. 13 | 14 | Returns the interpretation of the given properties, optionally in a Deferred. 15 | -------------------------------------------------------------------------------- /master/docs/developer/cls-worker.rst: -------------------------------------------------------------------------------- 1 | Workers 2 | ======= 3 | 4 | .. py:module:: buildbot.worker 5 | 6 | The :py:class:`Worker` class represents a worker, which may or may not be connected to the master. 7 | Instances of this class are created directly in the Buildbot configuration file. 8 | 9 | Worker 10 | ------ 11 | 12 | .. py:class:: Worker 13 | 14 | .. py:attribute:: workerid 15 | 16 | The ID of this worker in the database. 17 | -------------------------------------------------------------------------------- /master/docs/developer/database/index.rst: -------------------------------------------------------------------------------- 1 | Database connectors API 2 | ----------------------- 3 | 4 | This section documents the available database connector classes. 5 | 6 | .. toctree:: 7 | :maxdepth: 1 8 | 9 | buildsets 10 | buildrequests 11 | builders 12 | builds 13 | build_data 14 | steps 15 | logs 16 | changes 17 | changesources 18 | schedulers 19 | sourcestamps 20 | state 21 | users 22 | masters 23 | workers 24 | -------------------------------------------------------------------------------- /master/docs/developer/general.rst: -------------------------------------------------------------------------------- 1 | General Documents 2 | ================= 3 | 4 | This section gives some general information about Buildbot development. 5 | 6 | .. toctree:: 7 | :maxdepth: 2 8 | 9 | master-overview 10 | style 11 | tests 12 | config 13 | schedulers 14 | utils 15 | results 16 | www-server 17 | www-data-module 18 | www-base-app 19 | auth 20 | authz 21 | master-worker 22 | br-claiming 23 | encodings 24 | metrics 25 | secrets 26 | stats-service 27 | plugins-publish 28 | -------------------------------------------------------------------------------- /master/docs/developer/index.rst: -------------------------------------------------------------------------------- 1 | .. _Buildbot Development: 2 | .. _Public-API: 3 | 4 | Buildbot Development 5 | ==================== 6 | 7 | This chapter is the official repository for the collected wisdom of the Buildbot hackers. 8 | It is intended both for developers writing patches that will be included in Buildbot itself, and for advanced users who wish to customize Buildbot. 9 | 10 | .. note:: 11 | 12 | **Public API** 13 | 14 | Any API that is not documented in the official Buildbot documentation is considered internal and subject to change. 15 | If you would like in to be officially exposed, open a bug report on the `Buildbot Github project `_. 16 | 17 | .. toctree:: 18 | :maxdepth: 2 19 | 20 | quickstart 21 | pull-request 22 | general 23 | rest 24 | raml/index 25 | data 26 | database 27 | database/index 28 | mq 29 | classes 30 | -------------------------------------------------------------------------------- /master/docs/developer/raml/build.rst: -------------------------------------------------------------------------------- 1 | .. jinja:: data_api_build 2 | :file: templates/raml.jinja 3 | -------------------------------------------------------------------------------- /master/docs/developer/raml/build_data.rst: -------------------------------------------------------------------------------- 1 | .. jinja:: data_api_build_data 2 | :file: templates/raml.jinja 3 | -------------------------------------------------------------------------------- /master/docs/developer/raml/builder.rst: -------------------------------------------------------------------------------- 1 | .. jinja:: data_api_builder 2 | :file: templates/raml.jinja 3 | -------------------------------------------------------------------------------- /master/docs/developer/raml/buildrequest.rst: -------------------------------------------------------------------------------- 1 | .. jinja:: data_api_buildrequest 2 | :file: templates/raml.jinja 3 | -------------------------------------------------------------------------------- /master/docs/developer/raml/buildset.rst: -------------------------------------------------------------------------------- 1 | .. jinja:: data_api_buildset 2 | :file: templates/raml.jinja 3 | -------------------------------------------------------------------------------- /master/docs/developer/raml/change.rst: -------------------------------------------------------------------------------- 1 | .. jinja:: data_api_change 2 | :file: templates/raml.jinja 3 | -------------------------------------------------------------------------------- /master/docs/developer/raml/changesource.rst: -------------------------------------------------------------------------------- 1 | .. jinja:: data_api_changesource 2 | :file: templates/raml.jinja 3 | -------------------------------------------------------------------------------- /master/docs/developer/raml/forcescheduler.rst: -------------------------------------------------------------------------------- 1 | .. jinja:: data_api_forcescheduler 2 | :file: templates/raml.jinja 3 | -------------------------------------------------------------------------------- /master/docs/developer/raml/identifier.rst: -------------------------------------------------------------------------------- 1 | .. jinja:: data_api_identifier 2 | :file: templates/raml.jinja 3 | -------------------------------------------------------------------------------- /master/docs/developer/raml/index.rst: -------------------------------------------------------------------------------- 1 | .. _REST_API_specs: 2 | 3 | REST API Specification 4 | ====================== 5 | 6 | This section documents the available REST APIs according to the RAML specification. 7 | 8 | .. toctree:: 9 | :maxdepth: 1 10 | 11 | builder 12 | buildrequest 13 | build 14 | buildset 15 | build_data 16 | change 17 | changesource 18 | forcescheduler 19 | identifier 20 | logchunk 21 | log 22 | master 23 | patch 24 | rootlink 25 | scheduler 26 | sourcedproperties 27 | sourcestamp 28 | spec 29 | step 30 | worker 31 | test_result 32 | test_result_set 33 | raw-endpoints 34 | -------------------------------------------------------------------------------- /master/docs/developer/raml/log.rst: -------------------------------------------------------------------------------- 1 | .. jinja:: data_api_log 2 | :file: templates/raml.jinja 3 | -------------------------------------------------------------------------------- /master/docs/developer/raml/logchunk.rst: -------------------------------------------------------------------------------- 1 | .. jinja:: data_api_logchunk 2 | :file: templates/raml.jinja 3 | -------------------------------------------------------------------------------- /master/docs/developer/raml/master.rst: -------------------------------------------------------------------------------- 1 | .. jinja:: data_api_master 2 | :file: templates/raml.jinja 3 | -------------------------------------------------------------------------------- /master/docs/developer/raml/patch.rst: -------------------------------------------------------------------------------- 1 | .. jinja:: data_api_patch 2 | :file: templates/raml.jinja 3 | -------------------------------------------------------------------------------- /master/docs/developer/raml/raw-endpoints.rst: -------------------------------------------------------------------------------- 1 | Raw endpoints 2 | ............. 3 | 4 | .. jinja:: data_api 5 | 6 | Raw endpoints allow to download content in their raw format (i.e. not within a json glue). 7 | The ``content-disposition`` http header is set, so that the browser knows which file to store the content to. 8 | 9 | {% for ep, config in raml.rawendpoints.items()|sort %} 10 | 11 | .. bb:rpath:: {{ep}} 12 | 13 | {% for key, value in config.uriParameters.items() -%} 14 | :pathkey {{value.type}} {{key}}: {{raml.reindent(value.description, 4*2)}} 15 | {% endfor %} 16 | 17 | {{config['get'].description}} 18 | 19 | {% endfor %} 20 | -------------------------------------------------------------------------------- /master/docs/developer/raml/rootlink.rst: -------------------------------------------------------------------------------- 1 | .. jinja:: data_api_rootlink 2 | :file: templates/raml.jinja 3 | -------------------------------------------------------------------------------- /master/docs/developer/raml/scheduler.rst: -------------------------------------------------------------------------------- 1 | .. jinja:: data_api_scheduler 2 | :file: templates/raml.jinja 3 | -------------------------------------------------------------------------------- /master/docs/developer/raml/sourcedproperties.rst: -------------------------------------------------------------------------------- 1 | .. jinja:: data_api_sourcedproperties 2 | :file: templates/raml.jinja 3 | -------------------------------------------------------------------------------- /master/docs/developer/raml/sourcestamp.rst: -------------------------------------------------------------------------------- 1 | .. jinja:: data_api_sourcestamp 2 | :file: templates/raml.jinja 3 | -------------------------------------------------------------------------------- /master/docs/developer/raml/spec.rst: -------------------------------------------------------------------------------- 1 | .. jinja:: data_api_spec 2 | :file: templates/raml.jinja 3 | -------------------------------------------------------------------------------- /master/docs/developer/raml/step.rst: -------------------------------------------------------------------------------- 1 | .. jinja:: data_api_step 2 | :file: templates/raml.jinja 3 | -------------------------------------------------------------------------------- /master/docs/developer/raml/test_result.rst: -------------------------------------------------------------------------------- 1 | .. jinja:: data_api_test_result 2 | :file: templates/raml.jinja 3 | -------------------------------------------------------------------------------- /master/docs/developer/raml/test_result_set.rst: -------------------------------------------------------------------------------- 1 | .. jinja:: data_api_test_result_set 2 | :file: templates/raml.jinja 3 | -------------------------------------------------------------------------------- /master/docs/developer/raml/worker.rst: -------------------------------------------------------------------------------- 1 | .. jinja:: data_api_worker 2 | :file: templates/raml.jinja 3 | -------------------------------------------------------------------------------- /master/docs/indices.rst: -------------------------------------------------------------------------------- 1 | API Indices 2 | =========== 3 | 4 | * :ref:`apiindex` 5 | * :bb:index:`cfg` 6 | * :bb:index:`sched` 7 | * :bb:index:`chsrc` 8 | * :bb:index:`step` 9 | * :bb:index:`reportgen` 10 | * :bb:index:`reporter` 11 | * :bb:index:`cmdline` 12 | * :bb:index:`msg` 13 | * :bb:index:`event` 14 | * :bb:index:`rtype` 15 | * :bb:index:`rpath` 16 | * :bb:index:`raction` 17 | * :ref:`genindex` 18 | -------------------------------------------------------------------------------- /master/docs/manual/_images/Makefile: -------------------------------------------------------------------------------- 1 | 2 | SOURCES = overview_src.svg changes_src.svg workers_src.svg master_src.svg 3 | SVGS = $(patsubst %_src.svg,%.svg,$(SOURCES)) 4 | PNGS = $(patsubst %_src.svg,%.png,$(SOURCES)) 5 | 6 | .PHONY: images-svg images-png images-eps 7 | all: $(SVGS) $(PNGS) $(EPSS) 8 | images-svg: $(SVGS) 9 | images-png: $(PNGS) 10 | 11 | # Source SVG files contains text labels in "Noto Sans" font which may not be 12 | # installed on end user machine. Render these text labels into paths. 13 | # "Noto Sans" font can be downloaded from Google Fonts collection. 14 | %.svg: %_src.svg 15 | cp $< _tmp.svg 16 | # Render text as path. 17 | inkscape _tmp.svg --verb EditSelectAll --verb=ObjectToPath --verb FileSave --verb FileQuit 18 | # Cleanup SVG to reduce its size. 19 | scour --enable-comment-stripping --remove-metadata -i _tmp.svg -o $@ 20 | rm -f _tmp.svg 21 | %.png: %.svg 22 | inkscape -b white --export-png $@ $< 23 | mogrify -trim +repage $@ 24 | clean: 25 | rm -f $(PNGS) $(SVGS) 26 | -------------------------------------------------------------------------------- /master/docs/manual/_images/badges-badgeio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/docs/manual/_images/badges-badgeio.png -------------------------------------------------------------------------------- /master/docs/manual/_images/changes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/docs/manual/_images/changes.png -------------------------------------------------------------------------------- /master/docs/manual/_images/forcedialog1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/docs/manual/_images/forcedialog1.png -------------------------------------------------------------------------------- /master/docs/manual/_images/icon.blend: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/docs/manual/_images/icon.blend -------------------------------------------------------------------------------- /master/docs/manual/_images/master.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/docs/manual/_images/master.png -------------------------------------------------------------------------------- /master/docs/manual/_images/overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/docs/manual/_images/overview.png -------------------------------------------------------------------------------- /master/docs/manual/_images/vault_multipart_key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/docs/manual/_images/vault_multipart_key.png -------------------------------------------------------------------------------- /master/docs/manual/_images/vault_simple_key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/docs/manual/_images/vault_simple_key.png -------------------------------------------------------------------------------- /master/docs/manual/_images/workers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/docs/manual/_images/workers.png -------------------------------------------------------------------------------- /master/docs/manual/configuration/report_generators/formatter_renderable.rst: -------------------------------------------------------------------------------- 1 | .. _MessageFormatterRenderable: 2 | 3 | MessageFormatterRenderable 4 | ++++++++++++++++++++++++++ 5 | 6 | .. py:currentmodule:: buildbot.reporters.message 7 | 8 | This formatter is used to format messages in :ref:`Reportgen-BuildStatusGenerator`. 9 | 10 | It renders any renderable using the properties of the build that was passed by the status generator. 11 | 12 | The constructor of the class takes the following arguments: 13 | 14 | ``template`` 15 | A renderable that is used to generate the body of the build report. 16 | 17 | ``subject`` 18 | A renderable that is used to generate the subject of the build report. 19 | -------------------------------------------------------------------------------- /master/docs/manual/configuration/report_generators/worker.rst: -------------------------------------------------------------------------------- 1 | .. bb:reportgen:: WorkerMissingGenerator 2 | 3 | .. _Reportgen-WorkerMissingGenerator: 4 | 5 | WorkerMissingGenerator 6 | ++++++++++++++++++++++ 7 | 8 | .. py:class:: buildbot.reporters.WorkerMissingGenerator 9 | 10 | This report generator sends a message when a worker goes missing. 11 | 12 | The following parameters are supported: 13 | 14 | ``workers`` 15 | (``"all"`` or a list of strings, optional). 16 | Identifies the workers for which to send a message. 17 | ``"all"`` (the default) means that a message will be sent when any worker goes missing. 18 | The list version of the parameter specifies the names of the workers. 19 | 20 | ``message_formatter`` 21 | (optional, instance of ``reporters.MessageFormatterMissingWorker``) 22 | This is an optional instance of the ``reporters.MessageFormatterMissingWorker`` class that can be used to generate a custom message. 23 | 24 | -------------------------------------------------------------------------------- /master/docs/manual/configuration/services.rst: -------------------------------------------------------------------------------- 1 | .. bb:cfg:: services 2 | 3 | Custom Services 4 | --------------- 5 | 6 | For advanced users or plugins writers, the 'services' key is available, and holds a list of :py:class:`buildbot.util.service.BuildbotService`. 7 | As this feature for advanced users, it is described in the developer section of the manual. 8 | 9 | This section will grow as soon as ready-to-use services are created. 10 | -------------------------------------------------------------------------------- /master/docs/manual/configuration/steps/assert.rst: -------------------------------------------------------------------------------- 1 | .. bb:step:: Assert 2 | 3 | .. _Step-Assert: 4 | 5 | Assert 6 | ++++++ 7 | 8 | .. py:class:: buildbot.steps.master.Assert 9 | 10 | This build step takes a Renderable or constant passed in as first argument. It will test if the expression evaluates to ``True`` and succeed the step or fail the step otherwise. 11 | -------------------------------------------------------------------------------- /master/docs/manual/configuration/steps/configure.rst: -------------------------------------------------------------------------------- 1 | .. bb:step:: Configure 2 | 3 | .. _Step-Configure: 4 | 5 | Configure 6 | +++++++++ 7 | 8 | .. py:class:: buildbot.steps.shell.Configure 9 | 10 | .. note:: 11 | 12 | This step is being migrated to :ref:`new-style`. 13 | A new-style equivalent is provided as ``ConfigureNewStyle``. 14 | This should be inherited by any custom steps until :ref:`Buildbot 3.0 is released<3.0_Upgrading>`. 15 | Regular uses without inheritance are not affected. 16 | 17 | This is intended to handle the :command:`./configure` step from autoconf-style projects, or the ``perl Makefile.PL`` step from perl :file:`MakeMaker.pm`-style modules. 18 | The default command is :command:`./configure` but you can change this by providing a ``command=`` parameter. 19 | The arguments are identical to :bb:step:`ShellCommand`. 20 | 21 | .. code-block:: python 22 | 23 | from buildbot.plugins import steps 24 | 25 | f.addStep(steps.Configure()) 26 | -------------------------------------------------------------------------------- /master/docs/manual/configuration/steps/deb_lintian.rst: -------------------------------------------------------------------------------- 1 | .. bb:step:: DebLintian 2 | 3 | .. _Step-DebLintian: 4 | 5 | DebLintian 6 | ++++++++++ 7 | 8 | The :bb:step:`DebLintian` step checks a build .deb for bugs and policy violations. 9 | The packages or changes file to test is specified in ``fileloc`` 10 | 11 | .. code-block:: python 12 | 13 | from buildbot.plugins import steps, util 14 | 15 | f.addStep(steps.DebLintian(fileloc=util.Interpolate("%(prop:deb-changes)s"))) 16 | 17 | This class adds the following arguments: 18 | 19 | ``fileloc`` 20 | (Optional, string) 21 | Location of the .deb or .changes files to test 22 | 23 | ``suppressTags`` 24 | (Optional, list of strings) 25 | List of tags to suppress 26 | 27 | All other arguments are identical to :bb:step:`ShellCommand`. 28 | -------------------------------------------------------------------------------- /master/docs/manual/configuration/steps/hlint.rst: -------------------------------------------------------------------------------- 1 | .. bb:step:: HLint 2 | 3 | .. _Step-HLint: 4 | 5 | HLint 6 | +++++ 7 | 8 | The :bb:step:`HLint` step runs Twisted Lore, a lint-like checker over a set of ``.xhtml`` files. 9 | Any deviations from recommended style is flagged and put in the output log. 10 | 11 | The step looks at the list of changes in the build to determine which files to check - it does not check all files. 12 | It specifically excludes any ``.xhtml`` files in the top-level ``sandbox/`` directory. 13 | 14 | The step takes a single, optional, parameter: ``python``. 15 | This specifies the Python executable to use to run Lore. 16 | 17 | .. code-block:: python 18 | 19 | from buildbot.plugins import steps 20 | 21 | f.addStep(steps.HLint()) 22 | -------------------------------------------------------------------------------- /master/docs/manual/configuration/steps/log_renderable.rst: -------------------------------------------------------------------------------- 1 | .. bb:step:: LogRenderable 2 | 3 | .. _Step-LogRenderable: 4 | 5 | LogRenderable 6 | +++++++++++++ 7 | 8 | .. py:class:: buildbot.steps.master.LogRenderable 9 | 10 | This build step takes content which can be renderable and logs it in a pretty-printed format. 11 | It can be useful for debugging properties during a build. 12 | -------------------------------------------------------------------------------- /master/docs/manual/configuration/steps/maxq.rst: -------------------------------------------------------------------------------- 1 | .. bb:step:: MaxQ 2 | 3 | .. _Step-MaxQ: 4 | 5 | MaxQ 6 | ++++ 7 | 8 | 9 | MaxQ (http://maxq.tigris.org/) is a web testing tool that allows you to record HTTP sessions and play them back. 10 | The :bb:step:`MaxQ` step runs this framework. 11 | 12 | .. code-block:: python 13 | 14 | from buildbot.plugins import steps 15 | 16 | f.addStep(steps.MaxQ(testdir='tests/')) 17 | 18 | The single argument, ``testdir``, specifies where the tests should be run. 19 | This directory will be passed to the ``run_maxq.py`` command, and the results analyzed. 20 | -------------------------------------------------------------------------------- /master/docs/manual/configuration/steps/perl_module_test.rst: -------------------------------------------------------------------------------- 1 | .. bb:step:: PerlModuleTest 2 | 3 | .. _Step-PerlModuleTest: 4 | 5 | PerlModuleTest 6 | ++++++++++++++ 7 | 8 | .. code-block:: python 9 | 10 | from buildbot.plugins import steps 11 | 12 | f.addStep(steps.PerlModuleTest()) 13 | 14 | This is a simple command that knows how to run tests of perl modules. 15 | It parses the output to determine the number of tests passed and failed and total number executed, saving the results for later query. 16 | The command is ``prove --lib lib -r t``, although this can be overridden with the ``command`` argument. 17 | All other arguments are identical to those for :bb:step:`ShellCommand`. 18 | -------------------------------------------------------------------------------- /master/docs/manual/configuration/steps/pylint.rst: -------------------------------------------------------------------------------- 1 | .. bb:step:: PyLint 2 | 3 | .. _Step-PyLint: 4 | 5 | PyLint 6 | ++++++ 7 | 8 | Similarly, the :bb:step:`PyLint` step will run :command:`pylint` and analyze the results. 9 | 10 | You must supply the command line to be used. 11 | There is no default. 12 | 13 | .. code-block:: python 14 | 15 | from buildbot.plugins import steps 16 | 17 | f.addStep(steps.PyLint(command=["pylint", "src"])) 18 | 19 | This step takes the following arguments: 20 | 21 | ``store_results`` 22 | (optional) Boolean, ``true`` if the test results should be stored in the test database. 23 | The default value is ``true``. 24 | -------------------------------------------------------------------------------- /master/docs/manual/configuration/steps/remove_pycs.rst: -------------------------------------------------------------------------------- 1 | .. bb:step:: RemovePYCs 2 | 3 | .. _Step-RemovePYCs: 4 | 5 | RemovePYCs 6 | ++++++++++ 7 | 8 | .. py:class:: buildbot.steps.python_twisted.RemovePYCs 9 | 10 | This is a simple built-in step that will remove ``.pyc`` files from the workdir. 11 | This is useful in builds that update their source (and thus do not automatically delete ``.pyc`` files) but where some part of the build process is dynamically searching for Python modules. 12 | Notably, trial has a bad habit of finding old test modules. 13 | 14 | .. code-block:: python 15 | 16 | from buildbot.plugins import steps 17 | 18 | f.addStep(steps.RemovePYCs()) 19 | -------------------------------------------------------------------------------- /master/docs/manual/configuration/steps/rpm_lint.rst: -------------------------------------------------------------------------------- 1 | .. bb:step:: RpmLint 2 | 3 | .. _Step-RpmLint: 4 | 5 | RpmLint 6 | +++++++ 7 | 8 | The :bb:step:`RpmLint` step checks for common problems in RPM packages or spec files: 9 | 10 | .. code-block:: python 11 | 12 | from buildbot.plugins import steps 13 | 14 | f.addStep(steps.RpmLint()) 15 | 16 | The step takes the following parameters 17 | 18 | ``fileloc`` 19 | The file or directory to check. 20 | In case of a directory, it is recursively searched for RPMs and spec files to check. 21 | 22 | ``config`` 23 | Path to a rpmlint config file. 24 | This is passed as the user configuration file if present. 25 | -------------------------------------------------------------------------------- /master/docs/manual/configuration/steps/set_property.rst: -------------------------------------------------------------------------------- 1 | .. bb:step:: SetProperty 2 | 3 | .. _Step-SetProperty: 4 | 5 | SetProperty 6 | +++++++++++ 7 | 8 | .. py:class:: buildbot.steps.master.SetProperty 9 | 10 | :bb:step:`SetProperty` takes two arguments of ``property`` and ``value`` where the ``value`` is to be assigned to the ``property`` key. 11 | It is usually called with the ``value`` argument being specified as a :ref:`Interpolate` object which allows the value to be built from other property values: 12 | 13 | .. code-block:: python 14 | 15 | from buildbot.plugins import steps, util 16 | 17 | f.addStep( 18 | steps.SetProperty( 19 | property="SomeProperty", 20 | value=util.Interpolate("sch=%(prop:scheduler)s, worker=%(prop:workername)s") 21 | ) 22 | ) 23 | -------------------------------------------------------------------------------- /master/docs/manual/configuration/steps/source_gerrit.rst: -------------------------------------------------------------------------------- 1 | .. bb:step:: Gerrit 2 | 3 | .. _Step-Gerrit: 4 | 5 | Gerrit 6 | ++++++ 7 | 8 | .. py:class:: buildbot.steps.source.gerrit.Gerrit 9 | 10 | :bb:step:`Gerrit` step is exactly like the :bb:step:`Git` step, except that it integrates with :bb:chsrc:`GerritChangeSource`, and will automatically checkout the additional changes. 11 | 12 | Gerrit integration can be also triggered using forced build with property named ``gerrit_change`` with values in format ``change_number/patchset_number``. 13 | This property will be translated into a branch name. 14 | This feature allows integrators to build with several pending interdependent changes, which at the moment cannot be described properly in Gerrit, and can only be described by humans. 15 | 16 | -------------------------------------------------------------------------------- /master/docs/manual/configuration/steps/subunit_shell_command.rst: -------------------------------------------------------------------------------- 1 | .. bb:step:: SubunitShellCommand 2 | 3 | .. _Step-SubunitShellCommand: 4 | 5 | SubunitShellCommand 6 | +++++++++++++++++++ 7 | 8 | .. py:class:: buildbot.steps.subunit.SubunitShellCommand 9 | 10 | This buildstep is similar to :bb:step:`ShellCommand`, except that it runs the log content through a subunit filter to extract test and failure counts. 11 | 12 | .. code-block:: python 13 | 14 | from buildbot.plugins import steps 15 | 16 | f.addStep(steps.SubunitShellCommand(command="make test")) 17 | 18 | This runs ``make test`` and filters it through subunit. 19 | The 'tests' and 'test failed' progress metrics will now accumulate test data from the test run. 20 | 21 | If ``failureOnNoTests`` is ``True``, this step will fail if no test is run. 22 | By default ``failureOnNoTests`` is False. 23 | -------------------------------------------------------------------------------- /master/docs/manual/configuration/steps/test.rst: -------------------------------------------------------------------------------- 1 | .. bb:step:: Test 2 | 3 | .. _Step-Test: 4 | 5 | Test 6 | ++++ 7 | 8 | .. note:: 9 | 10 | This step is being migrated to :ref:`new-style`. 11 | A new-style equivalent is provided as ``TestNewStyle``. 12 | This should be inherited by any custom steps until :ref:`Buildbot 3.0 is released<3.0_Upgrading>`. 13 | Regular uses without inheritance are not affected. 14 | 15 | .. code-block:: python 16 | 17 | from buildbot.plugins import steps 18 | 19 | f.addStep(steps.Test()) 20 | 21 | This is meant to handle unit tests. 22 | The default command is :command:`make test`, and the ``warnOnFailure`` flag is set. 23 | The other arguments are identical to :bb:step:`ShellCommand`. 24 | -------------------------------------------------------------------------------- /master/docs/manual/configuration/steps/treesize.rst: -------------------------------------------------------------------------------- 1 | .. bb:step:: TreeSize 2 | 3 | .. index:: Properties; tree-size-KiB 4 | 5 | .. _Step-TreeSize: 6 | 7 | TreeSize 8 | ++++++++ 9 | 10 | .. code-block:: python 11 | 12 | from buildbot.plugins import steps 13 | 14 | f.addStep(steps.TreeSize()) 15 | 16 | This is a simple command that uses the :command:`du` tool to measure the size of the code tree. 17 | It puts the size (as a count of 1024-byte blocks, aka 'KiB' or 'kibibytes') on the step's status text, and sets a build property named ``tree-size-KiB`` with the same value. 18 | All arguments are identical to :bb:step:`ShellCommand`. 19 | -------------------------------------------------------------------------------- /master/docs/manual/index.rst: -------------------------------------------------------------------------------- 1 | This is the Buildbot manual for Buildbot version |version|. 2 | 3 | Buildbot Manual 4 | --------------- 5 | 6 | .. toctree:: 7 | :maxdepth: 2 8 | 9 | introduction 10 | installation/index 11 | concepts 12 | secretsmanagement 13 | configuration/index 14 | customization 15 | cmdline 16 | resources 17 | optimization 18 | plugins 19 | deploy 20 | upgrading/index 21 | -------------------------------------------------------------------------------- /master/docs/manual/installation/components.rst: -------------------------------------------------------------------------------- 1 | .. _Buildbot-Components: 2 | 3 | Buildbot Components 4 | =================== 5 | 6 | Buildbot is shipped in two components: the *buildmaster* (called ``buildbot`` for legacy reasons) and the *worker*. 7 | The worker component has far fewer requirements, and is more broadly compatible than the buildmaster. 8 | You will need to carefully pick the environment in which to run your buildmaster, but the worker should be able to run just about anywhere. 9 | 10 | It is possible to install the buildmaster and worker on the same system, although for anything but the smallest installation this arrangement will not be very efficient. 11 | 12 | 13 | -------------------------------------------------------------------------------- /master/docs/manual/installation/index.rst: -------------------------------------------------------------------------------- 1 | Installation 2 | ============ 3 | 4 | .. toctree:: 5 | :maxdepth: 2 6 | 7 | components 8 | requirements 9 | installation 10 | buildmaster 11 | worker 12 | misc 13 | -------------------------------------------------------------------------------- /master/docs/manual/mydashboard.html: -------------------------------------------------------------------------------- 1 | ../../../smokes/templates/mydashboard.html -------------------------------------------------------------------------------- /master/docs/manual/mydashboard.py: -------------------------------------------------------------------------------- 1 | ../../../smokes/mydashboard.py -------------------------------------------------------------------------------- /master/docs/manual/resources.rst: -------------------------------------------------------------------------------- 1 | .. _Resources: 2 | 3 | Resources 4 | ========= 5 | 6 | The Buildbot home page is http://buildbot.net/. 7 | 8 | For configuration questions and general discussion, please use the ``buildbot-devel`` mailing list. 9 | The subscription instructions and archives are available at https://lists.buildbot.net/pipermail/devel/ 10 | 11 | The ``#buildbot`` channel on Freenode's IRC servers hosts development discussion, and often folks are available to answer questions there, as well. 12 | -------------------------------------------------------------------------------- /master/docs/manual/upgrading/1.0-upgrade.rst: -------------------------------------------------------------------------------- 1 | .. _1.0_Upgrading: 2 | 3 | Upgrading to Buildbot 1.0 4 | ========================= 5 | 6 | Upgrading a Buildbot instance from 0.9.x to 1.0 does not require any changes in the master configuration. 7 | Despite the major version bump, Buildbot 1.0 does not have major difference with the 0.9 series. 8 | 1.0.0 is rather the mark of API stability. 9 | -------------------------------------------------------------------------------- /master/docs/relnotes.rst.jinja: -------------------------------------------------------------------------------- 1 | {% for section, _ in sections|dictsort(by='key') %} 2 | {% set underline = "-" %} 3 | {% if section %} 4 | {{section}} 5 | {{ underline * section|length }}{% set underline = "~" %} 6 | 7 | {% endif %} 8 | {% if sections[section] %} 9 | {% for category, val in definitions|dictsort if category in sections[section]%} 10 | 11 | {{ definitions[category]['name'] }} 12 | {{ underline * definitions[category]['name']|length }} 13 | 14 | {% if definitions[category]['showcontent'] %} 15 | {% for text, values in sections[section][category]|dictsort(by='value') %} 16 | - {{ text }} 17 | {% endfor %} 18 | {% else %} 19 | - {{ sections[section][category]['']|sort|join(', ') }} 20 | 21 | 22 | {% endif %} 23 | {% if sections[section][category]|length == 0 %} 24 | 25 | No significant changes. 26 | 27 | 28 | {% else %} 29 | {% endif %} 30 | {% endfor %} 31 | {% else %} 32 | 33 | No significant changes. 34 | 35 | 36 | {% endif %} 37 | {% endfor %} 38 | -------------------------------------------------------------------------------- /master/docs/relnotes/0.3.1.txt: -------------------------------------------------------------------------------- 1 | Buildbot 0.3.1 was released 29 Apr 2003 2 | 3 | ** First release. 4 | 5 | ** Features implemented: 6 | 7 | change notification from FreshCVS server or parsed maildir contents 8 | 9 | timed builds 10 | 11 | basic builds, configure/compile/test 12 | 13 | some Twisted-specific build steps: docs, unit tests, debuild 14 | 15 | status reporting via web page 16 | 17 | ** Features still experimental/unpolished 18 | 19 | status reporting via PB client 20 | 21 | -------------------------------------------------------------------------------- /master/docs/relnotes/0.4.1.txt: -------------------------------------------------------------------------------- 1 | Buildbot-0.4.1 was released 09 Dec 2003 2 | 3 | ** MaildirSources fixed 4 | 5 | Several bugs in MaildirSource made them unusable. These have been fixed (for 6 | real this time). The Twisted buildbot is using an FCMaildirSource while they 7 | fix some FreshCVS daemon problems, which provided the encouragement for 8 | getting these bugs fixed. 9 | 10 | In addition, the use of DNotify (only available under linux) was somehow 11 | broken, possibly by changes in some recent version of Python. It appears to 12 | be working again now (against both python-2.3.3c1 and python-2.2.1). 13 | 14 | ** master.cfg can use 'basedir' variable 15 | 16 | As documented in the sample configuration file (but not actually implemented 17 | until now), a variable named 'basedir' is inserted into the namespace used 18 | by master.cfg . This can be used with something like: 19 | 20 | os.path.join(basedir, "maildir") 21 | 22 | to obtain a master-basedir-relative location. 23 | 24 | -------------------------------------------------------------------------------- /master/docs/relnotes/0.9.0b4.rst: -------------------------------------------------------------------------------- 1 | Release Notes for Buildbot 0.9.0b4 2 | ================================== 3 | 4 | The following are the release notes for Buildbot 0.9.0b4 5 | This version was released on October 20, 2015. 6 | 7 | See :ref:`Upgrading to Nine` for a guide to upgrading from 0.8.x to 0.9.x 8 | 9 | Master 10 | ------ 11 | 12 | This version is very similar to 0.9.0b3, re-released due to issues with PyPI uploads. 13 | 14 | Changes for Developers 15 | ~~~~~~~~~~~~~~~~~~~~~~ 16 | 17 | * The data API's ``startConsuming`` method has been removed. 18 | Instead of calling this method with a data API path, call ``self.master.mq.startConsuming`` with an appropriate message routing pattern. 19 | 20 | Slave 21 | ----- 22 | 23 | No changes since 0.9.0b3. 24 | 25 | Details 26 | ------- 27 | 28 | For a more detailed description of the changes made in this version, see the git log itself: 29 | 30 | .. code-block:: bash 31 | 32 | git log v0.9.0b3..v0.9.0b4 33 | -------------------------------------------------------------------------------- /master/docs/relnotes/0.9.0b5.rst: -------------------------------------------------------------------------------- 1 | Release Notes for Buildbot 0.9.0b5 2 | ================================== 3 | 4 | The following are the release notes for Buildbot 0.9.0b5. 5 | This version was released on October 21, 2015. 6 | 7 | See :ref:`Upgrading to Nine` for a guide to upgrading from 0.8.x to 0.9.x 8 | 9 | Master 10 | ------ 11 | 12 | This version addresses http://trac.buildbot.net/wiki/SecurityAlert090b4 by preventing dissemination of hook information via the web UI. 13 | 14 | This also reverts the addition of the frontend data service in 0.9.0b4, as that contained many bugs. 15 | It will be re-landed in a subsequent release. 16 | 17 | Slave 18 | ----- 19 | 20 | No changes. 21 | 22 | For a more detailed description of the changes made in this version, see the git log itself: 23 | 24 | .. code-block:: bash 25 | 26 | git log v0.9.0b4..0.9.0b5 27 | -------------------------------------------------------------------------------- /master/docs/relnotes/0.9.0rc3.rst: -------------------------------------------------------------------------------- 1 | Release Notes for Buildbot ``0.9.0rc3`` 2 | ======================================== 3 | 4 | 5 | The following are the release notes for Buildbot ``0.9.0rc3``. 6 | This version was released on September 14, 2016. 7 | 8 | See :ref:`Upgrading to Nine` for a guide to upgrading from 0.8.x to 0.9.x 9 | 10 | 11 | Master 12 | ------ 13 | 14 | Features 15 | ~~~~~~~~ 16 | 17 | * add tool to send usage data to buildbot.net :bb:cfg:`buildbotNetUsageData` 18 | 19 | Fixes 20 | ~~~~~ 21 | 22 | * Publish python module buildbot.buildslave in the dist files 23 | 24 | * Upgrade to guanlecoja 0.7 (for compatibility with node6) 25 | 26 | * Fix invocation of trial on windows, with twisted 16+ 27 | 28 | * Fix rare issue which makes buildbot throw a exception when there is a sourcestamp with no change for a particular codebase. 29 | 30 | 31 | Details 32 | ------- 33 | 34 | For a more detailed description of the changes made in this version, see the git log itself: 35 | 36 | .. code-block:: bash 37 | 38 | git log v0.9.0rc2..v0.9.0rc3 39 | -------------------------------------------------------------------------------- /master/docs/relnotes/0.9.0rc4.rst: -------------------------------------------------------------------------------- 1 | Release Notes for Buildbot ``0.9.0rc4`` 2 | ======================================== 3 | 4 | 5 | The following are the release notes for Buildbot ``0.9.0rc4``. 6 | This version was released on September 28, 2016. 7 | 8 | See :ref:`Upgrading to Nine` for a guide to upgrading from 0.8.x to 0.9.x 9 | 10 | 11 | Master 12 | ------ 13 | 14 | Fixes 15 | ~~~~~ 16 | 17 | * Fix the UI to better adapt to different screen width (:bug:`3614`) 18 | 19 | * Add more REST api documentation (document ``/raw`` endpoints, and ``POST`` actions) 20 | 21 | 22 | Details 23 | ------- 24 | 25 | For a more detailed description of the changes made in this version, see the git log itself: 26 | 27 | .. code-block:: bash 28 | 29 | git log v0.9.0rc3..v0.9.0rc4 30 | -------------------------------------------------------------------------------- /master/docs/tutorial/_images/builders.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/docs/tutorial/_images/builders.png -------------------------------------------------------------------------------- /master/docs/tutorial/_images/force-build.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/docs/tutorial/_images/force-build.png -------------------------------------------------------------------------------- /master/docs/tutorial/_images/index.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/docs/tutorial/_images/index.png -------------------------------------------------------------------------------- /master/docs/tutorial/_images/irc-testrun.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/docs/tutorial/_images/irc-testrun.png -------------------------------------------------------------------------------- /master/docs/tutorial/_images/runtests-success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/master/docs/tutorial/_images/runtests-success.png -------------------------------------------------------------------------------- /master/docs/tutorial/further.rst: -------------------------------------------------------------------------------- 1 | Further Reading 2 | =============== 3 | 4 | See the following user-contributed tutorials for other highlights and ideas: 5 | 6 | .. toctree:: 7 | :maxdepth: 2 8 | 9 | fiveminutes 10 | -------------------------------------------------------------------------------- /master/docs/tutorial/index.rst: -------------------------------------------------------------------------------- 1 | Buildbot Tutorial 2 | ================= 3 | 4 | Contents: 5 | 6 | .. toctree:: 7 | :maxdepth: 2 8 | 9 | firstrun 10 | tour 11 | docker 12 | further 13 | -------------------------------------------------------------------------------- /master/requirements-docker-extras.txt: -------------------------------------------------------------------------------- 1 | requests==2.25.1 2 | psycopg2==2.8.6 3 | txrequests==0.9.6 4 | -------------------------------------------------------------------------------- /master/setup.cfg: -------------------------------------------------------------------------------- 1 | [aliases] 2 | test = trial -m buildbot 3 | -------------------------------------------------------------------------------- /master/tox.ini: -------------------------------------------------------------------------------- 1 | # Tox (http://tox.testrun.org/) is a tool for running tests 2 | # in multiple virtualenvs. This configuration file will run the 3 | # test suite on all supported python versions. To use it, "pip install tox" 4 | # and then run "tox" from this directory. 5 | 6 | [tox] 7 | envlist = py26, py27 8 | 9 | [testenv] 10 | commands = python setup.py test 11 | -------------------------------------------------------------------------------- /pkg/setup.cfg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/pkg/setup.cfg -------------------------------------------------------------------------------- /pyinstaller/buildbot-worker.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import 2 | from __future__ import print_function 3 | 4 | from buildbot_worker.scripts.runner import run 5 | 6 | run() 7 | -------------------------------------------------------------------------------- /pyinstaller/buildbot-worker.spec: -------------------------------------------------------------------------------- 1 | # -*- mode: python -*- 2 | 3 | block_cipher = None 4 | 5 | 6 | a = Analysis(['buildbot-worker.py'], 7 | pathex=[], 8 | binaries=[], 9 | datas=[], 10 | hiddenimports=["buildbot_worker", "buildbot_worker.scripts.create_worker", "buildbot_worker.scripts.start", "buildbot_worker.scripts.stop", "buildbot_worker.scripts.restart", "buildbot_worker.bot"], 11 | hookspath=[], 12 | runtime_hooks=[], 13 | excludes=[], 14 | win_no_prefer_redirects=False, 15 | win_private_assemblies=False, 16 | cipher=block_cipher) 17 | pyz = PYZ(a.pure, a.zipped_data, 18 | cipher=block_cipher) 19 | exe = EXE(pyz, 20 | a.scripts, 21 | a.binaries, 22 | a.zipfiles, 23 | a.datas, 24 | name='buildbot-worker', 25 | debug=False, 26 | strip=False, 27 | upx=True, 28 | runtime_tmpdir=None, 29 | console=True ) 30 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.towncrier] 2 | package = "buildbot" 3 | package_dir = "master" 4 | filename = "master/docs/relnotes/index.rst" 5 | template = "master/docs/relnotes.rst.jinja" 6 | title_format = "{name} ``{version}`` ( ``{project_date}`` )" 7 | [[tool.towncrier.section]] 8 | path = "" 9 | 10 | [[tool.towncrier.type]] 11 | directory = "feature" 12 | name = "Features" 13 | showcontent = true 14 | 15 | [[tool.towncrier.type]] 16 | directory = "bugfix" 17 | name = "Bug fixes" 18 | showcontent = true 19 | 20 | [[tool.towncrier.type]] 21 | directory = "doc" 22 | name = "Improved Documentation" 23 | showcontent = true 24 | 25 | [[tool.towncrier.type]] 26 | directory = "removal" 27 | name = "Deprecations and Removals" 28 | showcontent = true 29 | 30 | [[tool.towncrier.type]] 31 | directory = "misc" 32 | name = "Misc" 33 | showcontent = false 34 | -------------------------------------------------------------------------------- /readthedocs.yaml: -------------------------------------------------------------------------------- 1 | version: 2 2 | 3 | build: 4 | image: latest 5 | 6 | python: 7 | version: 3.6 8 | install: 9 | - requirements: requirements-readthedocs.txt 10 | -------------------------------------------------------------------------------- /requirements-cidb.txt: -------------------------------------------------------------------------------- 1 | psycopg2-binary==2.8.6 2 | mysqlclient==2.0.2 3 | # Pre-1.4 SQLAlchemy does not support 1.16.6 due to incompatible change, 4 | # https://github.com/sqlalchemy/sqlalchemy/issues/5645 5 | pg8000==1.16.5 # pyup: ignore 6 | -------------------------------------------------------------------------------- /requirements-cidocs.txt: -------------------------------------------------------------------------------- 1 | Sphinx==3.4.0 2 | sphinx-jinja==1.1.0 3 | sphinx-rtd-theme==0.5.0 4 | sphinxcontrib-blockdiag==2.0.0 5 | sphinxcontrib-spelling==7.1.0 6 | sphinxcontrib-websupport==1.2.4 7 | Pygments==2.7.3 8 | towncrier==19.2.0 9 | -------------------------------------------------------------------------------- /requirements-ciworker.txt: -------------------------------------------------------------------------------- 1 | attrs==20.3.0 2 | Automat==20.2.0 3 | constantly==15.1.0 4 | funcsigs==1.0.2 5 | future==0.18.2 6 | hyperlink==20.0.1 7 | idna==2.10 8 | incremental==17.5.0 9 | # pin mock, because 4.x no longer supports Python 3.5 10 | mock==3.0.5 # pyup: ignore 11 | pbr==5.5.1 12 | # pin PyHamcrest, because 2.x no longer supports Python 2.7 13 | PyHamcrest==1.9.0 # pyup: ignore 14 | six==1.15.0 15 | Twisted==20.3.0 16 | zope.interface==5.2.0 17 | -e worker 18 | -------------------------------------------------------------------------------- /requirements-readthedocs.txt: -------------------------------------------------------------------------------- 1 | # Requirements list for building documentation on ReadTheDocs. 2 | 3 | # Install master with the docs dependencies 4 | -e master[docs] -------------------------------------------------------------------------------- /smokes/e2e/about.scenarios.ts: -------------------------------------------------------------------------------- 1 | // test goal: checks the capability to navigate on about web page 2 | // to use previous and next link 3 | 4 | import { AboutPage } from './pages/about'; 5 | 6 | describe('', function() { 7 | let about = null; 8 | 9 | beforeEach(() => about = new AboutPage('runtests')); 10 | 11 | 12 | describe('check about page', () => 13 | it('should navigate to the about page, check the default elements inside', async () => { 14 | await about.goAbout(); 15 | await about.checkBuildbotTitle(); 16 | await about.checkConfigTitle(); 17 | await about.checkAPIDescriptionTitle(); 18 | }) 19 | ); 20 | }); 21 | -------------------------------------------------------------------------------- /smokes/e2e/pages/console.ts: -------------------------------------------------------------------------------- 1 | // this file contains the different generic functions which 2 | // will be called by the different tests 3 | 4 | import { BasePage } from "./base"; 5 | import { by, element, ExpectedConditions as EC } from 'protractor'; 6 | import { bbrowser } from '../utils'; 7 | 8 | export class ConsolePage extends BasePage { 9 | constructor() { 10 | super(); 11 | } 12 | 13 | async go() { 14 | await bbrowser.get('#/console'); 15 | await bbrowser.wait(EC.urlContains('#/console'), 16 | "URL does not contain #/console"); 17 | } 18 | 19 | async countSuccess() { 20 | return await element.all(By.css('.badge-status.results_SUCCESS')).count(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /smokes/e2e/pages/dashboard.ts: -------------------------------------------------------------------------------- 1 | // this file will contains the different generic functions which 2 | // will be called by the different tests 3 | 4 | import { BasePage } from "./base"; 5 | import { browser, by, element, ExpectedConditions as EC } from 'protractor'; 6 | import { bbrowser } from '../utils'; 7 | 8 | export class DashboardPage extends BasePage { 9 | constructor() { 10 | super(); 11 | } 12 | 13 | async go() { 14 | await bbrowser.get('#/mydashboard'); 15 | await bbrowser.wait(EC.urlContains('#/mydashboard'), 16 | "URL does not contain #/mydashboard"); 17 | var buildLink = element.all(By.linkText("runtests/1")).first(); 18 | await bbrowser.wait(EC.elementToBeClickable(buildLink), 19 | "runtests/1 link not clickable"); 20 | await buildLink.click(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /smokes/e2e/pages/pendingbuildrequests.ts: -------------------------------------------------------------------------------- 1 | // this file will contains the different generic functions which 2 | // will be called by the different tests 3 | 4 | import { BasePage } from "./base"; 5 | import { browser, by, element, ExpectedConditions as EC } from 'protractor'; 6 | import { bbrowser } from '../utils'; 7 | 8 | export class PendingBuildrequestsPage extends BasePage { 9 | 10 | constructor() { 11 | super(); 12 | } 13 | 14 | async go() { 15 | await bbrowser.get('#/pendingbuildrequests'); 16 | await bbrowser.wait(EC.urlContains('#/pendingbuildrequests'), 17 | "URL does not contain #/pendingbuildrequests"); 18 | } 19 | 20 | getAllBuildrequestRows() { 21 | return element.all(By.css("td .badge-status")).all(By.xpath('../../..')); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /smokes/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "smokes", 3 | "version": "1.0.0", 4 | "description": "smoke tests for buildbot with protractor", 5 | "main": "index.js", 6 | "dependencies": { 7 | "jasmine-spec-reporter": "^4.2.1", 8 | "protractor": "^5.4.2", 9 | "request": "^2.88.0", 10 | "ts-node": "~4.1.0", 11 | "tslint": "~5.9.1", 12 | "typescript": "^2.5.3" 13 | }, 14 | "devDependencies": {}, 15 | "scripts": { 16 | "test": "echo \"Error: no test specified\" && exit 1" 17 | }, 18 | "author": "", 19 | "license": "ISC" 20 | } 21 | -------------------------------------------------------------------------------- /smokes/tsconfig.ee.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "./out-tsc/e2e", 5 | "sourceMap": true, 6 | "removeComments": false, 7 | "baseUrl": "./", 8 | "module": "commonjs", 9 | "target": "es2017", 10 | "types": [ 11 | "jasmine", 12 | "jasminewd2", 13 | "node" 14 | ] 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /smokes/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compileOnSave": false, 3 | "compilerOptions": { 4 | "outDir": "./dist/out-tsc", 5 | "sourceMap": true, 6 | "declaration": false, 7 | "moduleResolution": "node", 8 | "emitDecoratorMetadata": true, 9 | "experimentalDecorators": true, 10 | "target": "es6", 11 | "typeRoots": [ 12 | "node_modules/@types" 13 | ], 14 | "lib": [ 15 | "es2017", 16 | "dom", 17 | "es2015.promise" 18 | ] 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /worker/MANIFEST.in: -------------------------------------------------------------------------------- 1 | include MANIFEST.in README COPYING UPGRADING 2 | include bin/buildbot-worker 3 | include docs/buildbot-worker.1 4 | 5 | include contrib/windows/* contrib/os-x/* contrib/init-scripts/* 6 | include contrib/zsh/* contrib/bash/* 7 | -------------------------------------------------------------------------------- /worker/Makefile: -------------------------------------------------------------------------------- 1 | # developer utilities 2 | pylint: 3 | pylint -j4 --rcfile=../common/pylintrc --disable=super-with-arguments,raise-missing-from buildbot_worker setup.py 4 | 5 | flake8: 6 | flake8 --config=../common/flake8rc buildbot_worker setup.py 7 | -------------------------------------------------------------------------------- /worker/UPGRADING: -------------------------------------------------------------------------------- 1 | For information on ugprading Buildbot, see the section "Upgrading" in the buildbot documentation. 2 | 3 | This may be found locally in docs/manual/upgrading/index.rst of the buildbot-master package. 4 | -------------------------------------------------------------------------------- /worker/buildbot_worker/backports/__init__.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | # This file is part of Buildbot. Buildbot is free software: you can 3 | # redistribute it and/or modify it under the terms of the GNU General Public 4 | # License as published by the Free Software Foundation, version 2. 5 | # 6 | # This program is distributed in the hope that it will be useful, but WITHOUT 7 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 8 | # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 9 | # details. 10 | # 11 | # You should have received a copy of the GNU General Public License along with 12 | # this program; if not, write to the Free Software Foundation, Inc., 51 13 | # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 14 | # 15 | # Copyright Buildbot Team Members 16 | 17 | try: 18 | from twisted.trial.unittest import SynchronousTestCase 19 | except ImportError: 20 | from twisted.trial.unittest import TestCase as SynchronousTestCase 21 | 22 | __all__ = ['SynchronousTestCase'] 23 | -------------------------------------------------------------------------------- /worker/buildbot_worker/bot.py: -------------------------------------------------------------------------------- 1 | # This file is part of Buildbot. Buildbot is free software: you can 2 | # redistribute it and/or modify it under the terms of the GNU General Public 3 | # License as published by the Free Software Foundation, version 2. 4 | # 5 | # This program is distributed in the hope that it will be useful, but WITHOUT 6 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 7 | # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 8 | # details. 9 | # 10 | # You should have received a copy of the GNU General Public License along with 11 | # this program; if not, write to the Free Software Foundation, Inc., 51 12 | # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 13 | # 14 | # Copyright Buildbot Team Members 15 | 16 | from __future__ import absolute_import 17 | from __future__ import print_function 18 | 19 | from buildbot_worker.null import LocalWorker 20 | from buildbot_worker.pb import Worker 21 | 22 | __all__ = ['Worker', 'LocalWorker'] 23 | -------------------------------------------------------------------------------- /worker/buildbot_worker/commands/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/worker/buildbot_worker/commands/__init__.py -------------------------------------------------------------------------------- /worker/buildbot_worker/invalid_utf8.bugfix: -------------------------------------------------------------------------------- 1 | - Fixed escaping of invalid UTF-8 sequences in log files that are 2 | being watched by the worker (:issue:`4744`). 3 | -------------------------------------------------------------------------------- /worker/buildbot_worker/monkeypatches/__init__.py: -------------------------------------------------------------------------------- 1 | # This file is part of Buildbot. Buildbot is free software: you can 2 | # redistribute it and/or modify it under the terms of the GNU General Public 3 | # License as published by the Free Software Foundation, version 2. 4 | # 5 | # This program is distributed in the hope that it will be useful, but WITHOUT 6 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 7 | # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 8 | # details. 9 | # 10 | # You should have received a copy of the GNU General Public License along with 11 | # this program; if not, write to the Free Software Foundation, Inc., 51 12 | # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 13 | # 14 | # Copyright Buildbot Team Members 15 | 16 | 17 | def patch_all(for_tests=False): 18 | if for_tests: 19 | from buildbot_worker.monkeypatches import testcase_assert 20 | testcase_assert.patch() 21 | -------------------------------------------------------------------------------- /worker/buildbot_worker/scripts/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/worker/buildbot_worker/scripts/__init__.py -------------------------------------------------------------------------------- /worker/buildbot_worker/test/fake/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/worker/buildbot_worker/test/fake/__init__.py -------------------------------------------------------------------------------- /worker/buildbot_worker/test/unit/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/worker/buildbot_worker/test/unit/__init__.py -------------------------------------------------------------------------------- /worker/buildbot_worker/test/util/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/worker/buildbot_worker/test/util/__init__.py -------------------------------------------------------------------------------- /worker/setup.cfg: -------------------------------------------------------------------------------- 1 | [aliases] 2 | test = trial -m buildbot_worker 3 | [bdist_wheel] 4 | universal=1 5 | -------------------------------------------------------------------------------- /worker/tox.ini: -------------------------------------------------------------------------------- 1 | # Tox (http://tox.testrun.org/) is a tool for running tests 2 | # in multiple virtualenvs. This configuration file will run the 3 | # test suite on all supported python versions. To use it, "pip install tox" 4 | # and then run "tox" from this directory. 5 | 6 | [tox] 7 | envlist = py24, py25, py26, py27, py35, py36, py37 8 | 9 | [testenv] 10 | deps = setuptools_trial 11 | commands = python setup.py test 12 | -------------------------------------------------------------------------------- /www/README.txt: -------------------------------------------------------------------------------- 1 | # About # 2 | 3 | This directory contains the components that comprise the Buildbot web 4 | interface. The core interface is defined in `www/base`, with other plugins 5 | in sibling directories. 6 | 7 | # Connection to Python # 8 | 9 | The setup.py script in each directory is designed to create wheel packages 10 | containing pre-built Angular files. This means that installing the 11 | buildbot-www package from PyPI gets all of the code required to run the 12 | Buildbot UI, without any requirement for Node.js or any NPM install. 13 | 14 | The ordinary 'python setup.py sdist' and 'python setup.py install' commands 15 | will work just as expected. 16 | 17 | # For Python Hackers # 18 | 19 | If you're finding yourself facing errors due to buildbot_www not being 20 | installed, try running `make prebuilt_frontend` in the root directory; this 21 | will install prebuilt versions of each of these distributions, based on the 22 | latest commits to the upstream master. 23 | -------------------------------------------------------------------------------- /www/badges/buildbot_badges/static/.placeholder: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/www/badges/buildbot_badges/static/.placeholder -------------------------------------------------------------------------------- /www/badges/buildbot_badges/templates/flat-square.svg.j2: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {{ left.text }} 6 | {{ right.text }} 7 | 8 | 9 | -------------------------------------------------------------------------------- /www/badges/setup.cfg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/www/badges/setup.cfg -------------------------------------------------------------------------------- /www/badges/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | -------------------------------------------------------------------------------- /www/base/buildbot_www/__init__.py: -------------------------------------------------------------------------------- 1 | # This file is part of Buildbot. Buildbot is free software: you can 2 | # redistribute it and/or modify it under the terms of the GNU General Public 3 | # License as published by the Free Software Foundation, version 2. 4 | # 5 | # This program is distributed in the hope that it will be useful, but WITHOUT 6 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 7 | # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 8 | # details. 9 | # 10 | # You should have received a copy of the GNU General Public License along with 11 | # this program; if not, write to the Free Software Foundation, Inc., 51 12 | # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 13 | # 14 | # Copyright Buildbot Team Members 15 | 16 | from buildbot.www.plugin import Application 17 | 18 | # create the interface for the setuptools entry point 19 | ep = Application(__name__, "Buildbot UI") 20 | -------------------------------------------------------------------------------- /www/base/karma.conf.js: -------------------------------------------------------------------------------- 1 | const common = require('buildbot-build-common'); 2 | 3 | module.exports = function karmaConfig (config) { 4 | common.createTemplateKarmaConfig(config, { 5 | testRoot: 'src/tests.webpack.js', 6 | webpack: require('./webpack.config') 7 | }); 8 | }; 9 | 10 | -------------------------------------------------------------------------------- /www/base/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | autoprefixer: { 4 | browsers: ['last 2 versions'] 5 | }, 6 | }, 7 | }; 8 | -------------------------------------------------------------------------------- /www/base/setup.cfg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/www/base/setup.cfg -------------------------------------------------------------------------------- /www/base/src/app/about/about.controller.js: -------------------------------------------------------------------------------- 1 | class About { 2 | constructor($scope, config, restService) { 3 | 4 | $scope.config = config; 5 | 6 | restService.get('application.spec').then(specs => $scope.specs = specs['specs']); 7 | } 8 | } 9 | 10 | 11 | angular.module('app') 12 | .controller('aboutController', ['$scope', 'config', 'restService', About]); 13 | -------------------------------------------------------------------------------- /www/base/src/app/about/about.route.js: -------------------------------------------------------------------------------- 1 | class AboutState { 2 | constructor($stateProvider, glMenuServiceProvider) { 3 | 4 | // Name of the state 5 | const name = 'about'; 6 | 7 | // Menu configuration 8 | glMenuServiceProvider.addGroup({ 9 | name, 10 | caption: 'About', 11 | icon: 'info-circle', 12 | order: 99 13 | }); 14 | 15 | // Configuration 16 | const cfg = { 17 | group: name, 18 | caption: 'About' 19 | }; 20 | 21 | // Register new state 22 | const state = { 23 | controller: `${name}Controller`, 24 | template: require('./about.tpl.jade'), 25 | name, 26 | url: '/about', 27 | data: cfg 28 | }; 29 | 30 | $stateProvider.state(state); 31 | } 32 | } 33 | 34 | 35 | angular.module('app') 36 | .config(['$stateProvider', 'glMenuServiceProvider', AboutState]); 37 | -------------------------------------------------------------------------------- /www/base/src/app/app.browserwarning.notranspile.js: -------------------------------------------------------------------------------- 1 | // this file is not transpiled and included direcly to index.html because we must show the browser 2 | // warning even on ancient browsers. The browser list here must correspond to the browser list in 3 | // babel config which is located at www/build_common/src/webpack.js 4 | outdatedBrowserRework({ 5 | browserSupport: { 6 | 'Chrome': 56, // Includes Chrome for mobile devices 7 | 'Chromium': 56, // same as Chrome, but needs to be listed explicitly 8 | // (https://github.com/mikemaccana/outdated-browser-rework/issues/49) 9 | 'Edge': 13, 10 | 'Safari': 10, 11 | 'Mobile Safari': 10, 12 | 'Firefox': 52, 13 | 'Opera': 43, // uses Chrome 56 internally 14 | 'IE': false 15 | }, 16 | requireChromeOnAndroid: false, 17 | isUnknownBrowserOK: false, 18 | }); 19 | -------------------------------------------------------------------------------- /www/base/src/app/apps/app/app.route.js: -------------------------------------------------------------------------------- 1 | class AppState { 2 | constructor($stateProvider) { 3 | 4 | // Name of the state 5 | const name = 'app'; 6 | 7 | // Configuration 8 | const cfg = { 9 | tabid: 'apps', 10 | pageTitle: _.template("Flathub: app <%= app %>") 11 | }; 12 | 13 | // Register new state 14 | const state = { 15 | controller: `${name}Controller`, 16 | template: require('./app.tpl.jade'), 17 | name, 18 | url: '/apps/:app?numbuilds', 19 | data: cfg 20 | }; 21 | 22 | $stateProvider.state(state); 23 | } 24 | } 25 | 26 | 27 | angular.module('app') 28 | .config(['$stateProvider', AppState]); 29 | -------------------------------------------------------------------------------- /www/base/src/app/apps/app/app.tpl.jade: -------------------------------------------------------------------------------- 1 | .container 2 | .row 3 | h4 Build times: 4 | line-plot(data="successful_builds", xattr="started_at", yattr="duration", xunit="timestamp", yunit="seconds", width=800, height=200) 5 | span(ng-show='runningBuilds.length>0') 6 | h4 Current builds: 7 | builds-table(builder="builder", builds="runningBuilds") 8 | span(ng-show='unpublishedBuilds.length>0') 9 | h4 Unpublished builds: 10 | builds-table(builder="builder", builds="unpublishedBuilds") 11 | h4 Recent builds: 12 | builds-table(builder="builder", builds="recentBuilds") 13 | a.btn.btn-default(ui-sref='app({app: appname, numbuilds: numbuilds + 100})', ng-if="recentBuilds.length>=numbuilds") 14 | | more 15 | -------------------------------------------------------------------------------- /www/base/src/app/apps/apps.tpl.jade: -------------------------------------------------------------------------------- 1 | .container 2 | table.table.table-hover.table-striped.table-condensed(ng-show='builds.length>0') 3 | tr 4 | td(width='200px') App 5 | td Last build 6 | tr(ng-repeat='build in builds') 7 | td 8 | a(ui-sref="app({app:build.flathub_name})") 9 | | {{build.flathub_name }} 10 | td 11 | a(ui-sref="build({builder:mainBuilder.builderid, build:build.number})") 12 | span.badge-status(ng-class="results2class(build, 'pulse')") 13 | span.badge-inactive 14 | | {{build.number}} 15 | span.badge-active {{results2text(build)}} 16 | -------------------------------------------------------------------------------- /www/base/src/app/builders/builder/builder.route.js: -------------------------------------------------------------------------------- 1 | class BuilderState { 2 | constructor($stateProvider) { 3 | 4 | // Name of the state 5 | const name = 'builder'; 6 | 7 | // Configuration 8 | const cfg = { 9 | tabid: 'builders', 10 | pageTitle: _.template("Flathub: builder <%= builder %>") 11 | }; 12 | 13 | // Register new state 14 | const state = { 15 | controller: `${name}Controller`, 16 | template: require('./builder.tpl.jade'), 17 | name, 18 | url: '/builders/:builder?numbuilds', 19 | data: cfg 20 | }; 21 | 22 | $stateProvider.state(state); 23 | } 24 | } 25 | 26 | 27 | angular.module('app') 28 | .config(['$stateProvider', BuilderState]); 29 | -------------------------------------------------------------------------------- /www/base/src/app/builders/buildrequest/buildrequest.route.js: -------------------------------------------------------------------------------- 1 | class BuildRequestState { 2 | constructor($stateProvider) { 3 | 4 | // Name of the state 5 | const name = 'buildrequest'; 6 | 7 | // Register new state 8 | const state = { 9 | controller: `${name}Controller`, 10 | template: require('./buildrequest.tpl.jade'), 11 | name, 12 | data: {}, 13 | url: '/buildrequests/:buildrequest?redirect_to_build' 14 | }; 15 | 16 | $stateProvider.state(state); 17 | } 18 | } 19 | 20 | 21 | angular.module('app') 22 | .config(['$stateProvider', BuildRequestState]); 23 | -------------------------------------------------------------------------------- /www/base/src/app/builders/buildrequest/buildrequest.tpl.jade: -------------------------------------------------------------------------------- 1 | .container 2 | .row 3 | uib-tabset(justified="left") 4 | uib-tab(heading="build {{build.number}}", active="build.active", ng-repeat="build in builds") 5 | buildsummary(build="build") 6 | uib-tab(heading="properties") 7 | properties(properties="properties") 8 | uib-tab(heading="Debug") 9 | h4 Buildrequest 10 | rawdata(data="raw_buildrequest") 11 | h4 Buildset 12 | rawdata(data="buildset") 13 | h4 Builder 14 | rawdata(data="builder") 15 | h4 Builds 16 | rawdata(data="builds") 17 | -------------------------------------------------------------------------------- /www/base/src/app/builders/buildrequest/forcedialog/forcedialog.tpl.jade: -------------------------------------------------------------------------------- 1 | .modal-content 2 | form 3 | .modal-body 4 | // put the header in the body in order to correctly display error popup 5 | h4 {{sch_label}} 6 | hr 7 | div.form-horizontal 8 | .alert.alert-danger(ng-show="error") {{error}} 9 | .alert.alert-danger(ng-show="!sch.enabled") SCHEDULER DISABLED 10 | forcefield(field="rootfield" ng-if="rootfield") 11 | .modal-footer 12 | button.btn.btn-default(ng-click="cancel()") Cancel 13 | button.btn.btn-primary(type="submit", ng-click="ok()", ng-disabled="!sch.enabled || startDisabled") Start Build 14 | -------------------------------------------------------------------------------- /www/base/src/app/builders/log/log.route.js: -------------------------------------------------------------------------------- 1 | class LogState { 2 | constructor($stateProvider) { 3 | 4 | // Name of the state 5 | const name = 'log'; 6 | 7 | // Configuration 8 | const cfg = { 9 | tabid: 'builders', 10 | pageTitle: _.template("Flathub: log: <%= log %>") 11 | }; 12 | 13 | // Register new state 14 | const state = { 15 | controller: `${name}Controller`, 16 | template: require('./log.tpl.jade'), 17 | name, 18 | url: '/builders/:builder/builds/:build/steps/:step/logs/:log?jump_to_line', 19 | data: cfg 20 | }; 21 | 22 | $stateProvider.state(state); 23 | } 24 | } 25 | 26 | 27 | angular.module('app') 28 | .config(['$stateProvider', LogState]); 29 | -------------------------------------------------------------------------------- /www/base/src/app/builders/log/log.tpl.jade: -------------------------------------------------------------------------------- 1 | logviewer(log="log", jump-to-line="jumpToLine") 2 | -------------------------------------------------------------------------------- /www/base/src/app/builders/log/logviewer/logpreview.less: -------------------------------------------------------------------------------- 1 | .logpreview { 2 | margin-top:20px; 3 | } 4 | -------------------------------------------------------------------------------- /www/base/src/app/builders/log/logviewer/logviewer.less: -------------------------------------------------------------------------------- 1 | .logcontainer { 2 | width:100%; 3 | padding:0px; 4 | margin-top:-20px; 5 | pre { 6 | margin:0px; 7 | } 8 | } 9 | pre.log { 10 | div { 11 | height: 18px; 12 | } 13 | .linenumber { 14 | display: inline-block; 15 | width: 50px; 16 | } 17 | // It is much more difficult to do autoscroll if line wrap is enabled. 18 | // For now we just disable it. There is space for some smarter algorithm 19 | .no-wrap { 20 | white-space: pre; 21 | word-wrap: normal; 22 | } 23 | margin-top: 0px; 24 | margin-bottom: 0px; 25 | overflow: auto; 26 | } 27 | 28 | .logoptions { 29 | margin-top: 0px; 30 | position: absolute; 31 | right: 17px; 32 | } 33 | .loading { 34 | margin-top: -40px; 35 | position: absolute; 36 | right: 17px; 37 | z-index:10000; 38 | } 39 | -------------------------------------------------------------------------------- /www/base/src/app/builders/services/timeout.factory.js: -------------------------------------------------------------------------------- 1 | /* 2 | * decaffeinate suggestions: 3 | * DS102: Remove unnecessary code created because of implicit returns 4 | * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md 5 | */ 6 | class scopeTimeout { 7 | constructor($timeout) { 8 | return function($scope, fn, delay, invokeApply) { 9 | const ret = $timeout(fn, delay, invokeApply); 10 | $scope.$on('$destroy', () => $timeout.cancel(ret)); 11 | return ret; 12 | }; 13 | } 14 | } 15 | 16 | angular.module('app') 17 | .factory('scopeTimeout', ['$timeout', scopeTimeout]); 18 | -------------------------------------------------------------------------------- /www/base/src/app/builders/step/step.route.js: -------------------------------------------------------------------------------- 1 | class StepState { 2 | constructor($stateProvider) { 3 | 4 | // Name of the state 5 | const name = 'step'; 6 | 7 | // Configuration 8 | const cfg = { 9 | tabid: 'builders', 10 | pageTitle: _.template("Buildbot: build <%= build %> step: <%= step %>") 11 | }; 12 | 13 | // Register new state 14 | $stateProvider.state({ 15 | controller: `${name}Controller`, 16 | template: require('./step.tpl.jade'), 17 | name, 18 | url: '/builders/:builder/builds/:build/steps/:step', 19 | data: cfg 20 | }); 21 | } 22 | } 23 | 24 | 25 | angular.module('app') 26 | .config(['$stateProvider', StepState]); 27 | -------------------------------------------------------------------------------- /www/base/src/app/builders/step/step.tpl.jade: -------------------------------------------------------------------------------- 1 | .container 2 | .row 3 | .col-sm-6 4 | | status: {{step.state_string}} 5 | ul.unstyled 6 | li(ng-repeat="log in step.logs") 7 | a(ui-sref="log({builder:builder.builderid, build:build.number, step: step.number, log:log.slug})") {{log.name}} 8 | ul.unstyled 9 | li(ng-repeat="url in step.urls") 10 | a(target="_blank", ng-href="{{url.url}}") {{url.name}} 11 | .col-sm-6 12 | rawdata(data="step") 13 | -------------------------------------------------------------------------------- /www/base/src/app/changes/changebuilds/changebuilds.tpl.jade: -------------------------------------------------------------------------------- 1 | .container 2 | .row 3 | changedetails(change="change") 4 | div(ng-if="builds") 5 | builds-table(builds="builds", builders="builders", ng-if="builds") 6 | -------------------------------------------------------------------------------- /www/base/src/app/changes/changes.controller.js: -------------------------------------------------------------------------------- 1 | class Changes { 2 | constructor($log, $scope, dataService, bbSettingsService, 3 | $location, $rootScope) { 4 | $scope.settings = bbSettingsService.getSettingsGroup("Changes"); 5 | $scope.$watch('settings', () => { bbSettingsService.save(); }, true); 6 | const changesFetchLimit = $scope.settings.changesFetchLimit.value; 7 | 8 | const data = dataService.open().closeOnDestroy($scope); 9 | // unlike other order, this particular order by changeid is optimised by the backend 10 | $scope.changes = data.getChanges({limit: changesFetchLimit, order:'-changeid'}); 11 | } 12 | } 13 | 14 | 15 | angular.module('app') 16 | .controller('changesController', ['$log', '$scope', 'dataService', 'bbSettingsService', '$location', '$rootScope', Changes]); 17 | -------------------------------------------------------------------------------- /www/base/src/app/changes/changes.tpl.jade: -------------------------------------------------------------------------------- 1 | .container 2 | .row 3 | changelist(changes="changes") 4 | -------------------------------------------------------------------------------- /www/base/src/app/common/common.module.js: -------------------------------------------------------------------------------- 1 | const dependencies = [ 2 | 'ui.router', 3 | 'RecursionHelper', 4 | 'buildbot_config' 5 | ]; 6 | 7 | // Register new module 8 | angular.module('common', dependencies); 9 | angular.module('app').requires.push('common'); 10 | -------------------------------------------------------------------------------- /www/base/src/app/common/directives/basefield/basefield.tpl.jade: -------------------------------------------------------------------------------- 1 | div 2 | div.form-group(ng-class="{'has-warning': field.warnings,'has-error': field.haserrors}") 3 | div(ng-transclude, 4 | uib-popover="{{field.errors}}", popover-title="{{field.label}}", 5 | popover-is-open="field.haserrors", popover-trigger="none") 6 | -------------------------------------------------------------------------------- /www/base/src/app/common/directives/builds/buildstable.directive.js: -------------------------------------------------------------------------------- 1 | class BuildsTable { 2 | constructor(RecursionHelper) { 3 | return { 4 | replace: true, 5 | restrict: 'E', 6 | scope: {builds: '=?', builder: '=?', builders: '=?'}, 7 | template: require('./buildstable.tpl.jade'), 8 | controller: '_buildstableController' 9 | }; 10 | } 11 | } 12 | class _buildstable { 13 | constructor($scope, resultsService) { 14 | // make resultsService utilities available in the template 15 | _.mixin($scope, resultsService); 16 | } 17 | } 18 | 19 | 20 | angular.module('common') 21 | .directive('buildsTable', ['RecursionHelper', BuildsTable]) 22 | .controller('_buildstableController', ['$scope', 'resultsService', _buildstable]); 23 | -------------------------------------------------------------------------------- /www/base/src/app/common/directives/buildsticker/buildsicker.less: -------------------------------------------------------------------------------- 1 | 2 | .buildsticker { 3 | width: 100%; 4 | margin: 0 2px 2px 0; 5 | 6 | .row { 7 | white-space: nowrap; 8 | text-overflow: ellipsis; 9 | overflow: hidden; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /www/base/src/app/common/directives/buildsticker/buildsticker.tpl.jade: -------------------------------------------------------------------------------- 1 | .panel.panel-default.buildsticker(ng-class="results2class(build)") 2 | .panel-body.no-select 3 | .row 4 | span.pull-right.label(ng-class="results2class(build)") {{results2text(build)}} 5 | a(ui-sref="build({builder:builder.builderid, build:build.number})") 6 | | {{builder.name}}/{{build.number}} 7 | .row 8 | span.pull-right(ng-show="build.complete") 9 | | {{(build.complete_at - build.started_at)| durationformat:'LLL' }} 10 | span.pull-right(ng-show="!build.complete") 11 | | {{(now - build.started_at)| durationformat:'LLL' }} 12 | span {{build.state_string}} 13 | -------------------------------------------------------------------------------- /www/base/src/app/common/directives/changedetails/changedetails.directive.js: -------------------------------------------------------------------------------- 1 | class Changedetails { 2 | constructor() { 3 | return { 4 | replace: true, 5 | restrict: 'E', 6 | scope: { 7 | change: '=', 8 | compact: '=?' 9 | }, 10 | template: require('./changedetails.tpl.jade'), 11 | }; 12 | } 13 | } 14 | 15 | 16 | angular.module('common') 17 | .directive('changedetails', [Changedetails]); 18 | -------------------------------------------------------------------------------- /www/base/src/app/common/directives/changelist/changelist.tpl.jade: -------------------------------------------------------------------------------- 1 | .container-fluid 2 | .row 3 | .navbar.navbar-default 4 | .container-fluid 5 | .navbar-header 6 | .navbar-brand 7 | | {{changes.length}} changes 8 | .navbar-form.navbar-right 9 | .form-group 10 | .btn.btn-default(ng-click="collapseDetails()", title="Collapse all") 11 | i.fa.fa-minus 12 | .btn.btn-default(ng-click="expandDetails()", title="Expand all") 13 | i.fa.fa-plus 14 | 15 | .row 16 | ul.list-group 17 | li.list-group-item(ng-repeat="change in changes") 18 | a(ui-sref="changebuilds({changeid: change.changeid})") 19 | | See builds 20 | changedetails(change="change") 21 | -------------------------------------------------------------------------------- /www/base/src/app/common/directives/connectionstatus/connectionstatus.less: -------------------------------------------------------------------------------- 1 | .connectionstatus 2 | { 3 | z-index: 1000; 4 | width: 100%; 5 | position: absolute; 6 | top: 20px; 7 | .alert { 8 | margin-left: auto; 9 | margin-right: auto; 10 | width: 300px; 11 | text-align: center; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /www/base/src/app/common/directives/connectionstatus/connectionstatus.tpl.jade: -------------------------------------------------------------------------------- 1 | .connectionstatus.anim-fade(ng-show="alertenabled") 2 | .alert.alert-warning(ng-show="connectionlost") 3 | i.fa.fa-spin.fa-spinner 4 | |  Connection Lost. Retrying... 5 | .alert.alert-success(ng-hide="connectionlost") 6 | | Connection restored! 7 | -------------------------------------------------------------------------------- /www/base/src/app/common/directives/forcefields/boolfield.tpl.jade: -------------------------------------------------------------------------------- 1 | div.form-group 2 | .col-sm-10.col-sm-offset-2 3 | .checkbox 4 | label 5 | input(type="checkbox", ng-model="field.value") 6 | | {{field.label}} 7 | -------------------------------------------------------------------------------- /www/base/src/app/common/directives/forcefields/filefield.tpl.jade: -------------------------------------------------------------------------------- 1 | basefield 2 | label.control-label.col-sm-2(for="{{field.name}}") 3 | | {{field.label}} 4 | .col-sm-9 5 | textarea.form-control(ng-if="field.safevalue !== false", rows="{{field.rows}}", ng-model="field.safevalue", ng-trim="false") 6 | label.control-label(ng-if="field.safevalue === false") {{field.value.length}} bytes file 7 | .col-sm-1 8 | input(type="file", id="file-{{field.name}}", style="display:none;", fileread="field.value") 9 | label.btn.btn-default.btn-small(for="file-{{field.name}}") 10 | i.fa.fa-file 11 | -------------------------------------------------------------------------------- /www/base/src/app/common/directives/forcefields/intfield.tpl.jade: -------------------------------------------------------------------------------- 1 | basefield 2 | label.control-label.col-sm-2(for="{{field.name}}") 3 | | {{field.label}} 4 | .col-sm-10 5 | input.form-control(type='text', ng-model="field.value") 6 | -------------------------------------------------------------------------------- /www/base/src/app/common/directives/forcefields/listfield.tpl.jade: -------------------------------------------------------------------------------- 1 | basefield 2 | label.control-label.col-sm-2(for="{{field.name}}") 3 | | {{field.label}} 4 | .col-sm-10 5 | select.form-control(ng-model="field.value", ng-if="!field.multiple", ng-options="v for v in field.choices") 6 | select.form-control(ng-model="field.value", multiple, ng-multiple="true", ng-if="field.multiple", ng-options="v for v in field.choices") 7 | input.select-editable.form-control(ng-if="!field.strict && !field.multiple", type='text', ng-model="field.value") 8 | -------------------------------------------------------------------------------- /www/base/src/app/common/directives/forcefields/nestedfield.tpl.jade: -------------------------------------------------------------------------------- 1 | div.form-horizontal 2 | div(ng-repeat='field in fields', class="{{column_class}}") 3 | div(ng-if='field.type === "nested"') 4 | .panel.panel-default 5 | .panel-heading(ng-if="field.name") 6 | | {{field.name}} 7 | .panel-body 8 | nestedfield(fields="field.fields", columns="field.columns") 9 | 10 | div(ng-if='field.type!=="nested" && !field.hide') 11 | forcefield(field="field") 12 | -------------------------------------------------------------------------------- /www/base/src/app/common/directives/forcefields/simplelayout.tpl.jade: -------------------------------------------------------------------------------- 1 | div.form-horizontal 2 | div(ng-repeat='field in field.fields | filter:{hide:false}', 3 | class="{{column_class}}") 4 | forcefield(field="field") 5 | -------------------------------------------------------------------------------- /www/base/src/app/common/directives/forcefields/styles.less: -------------------------------------------------------------------------------- 1 | input.select-editable { 2 | /* we put the input on top of the select, with a width of 90% 3 | so that the right side of the select if visible */ 4 | position:absolute; 5 | top:0; 6 | border:none; 7 | margin:2px; 8 | width:90%; 9 | height:29px; 10 | } 11 | -------------------------------------------------------------------------------- /www/base/src/app/common/directives/forcefields/tabslayout.tpl.jade: -------------------------------------------------------------------------------- 1 | div 2 | uib-tabset(justified="true") 3 | uib-tab(ng-repeat='field in field.fields | filter:{hide:false}', 4 | heading="{{field.tablabel}}", 5 | class="{{column_class}}") 6 | forcefield(recursive, 7 | field="field") 8 | -------------------------------------------------------------------------------- /www/base/src/app/common/directives/forcefields/textareafield.tpl.jade: -------------------------------------------------------------------------------- 1 | basefield 2 | label.control-label.col-sm-2(for="{{field.name}}") 3 | | {{field.label}} 4 | .col-sm-10 5 | textarea.form-control(rows="{{field.rows}}", ng-model="field.value") 6 | -------------------------------------------------------------------------------- /www/base/src/app/common/directives/forcefields/textfield.tpl.jade: -------------------------------------------------------------------------------- 1 | basefield 2 | label.control-label.col-sm-2(for="{{field.name}}") 3 | | {{field.label}} 4 | .col-sm-10 5 | input.form-control(type='text', ng-model="field.value", autocomplete="on" id="{{field.name}}") 6 | -------------------------------------------------------------------------------- /www/base/src/app/common/directives/forcefields/verticallayout.tpl.jade: -------------------------------------------------------------------------------- 1 | .panel.panel-default 2 | .panel-heading(ng-if="field.label") 3 | | {{field.label}} 4 | .panel-body 5 | div.form-horizontal 6 | div(ng-repeat='cfield in field.fields | filter:{hide:false}', 7 | class="{{column_class}}") 8 | forcefield(field="cfield") 9 | -------------------------------------------------------------------------------- /www/base/src/app/common/directives/lineplot/lineplot.tpl.jade: -------------------------------------------------------------------------------- 1 | svg.bblineplot -------------------------------------------------------------------------------- /www/base/src/app/common/directives/lineplot/styles.less: -------------------------------------------------------------------------------- 1 | .bblineplot { 2 | path { 3 | stroke: steelblue; 4 | stroke-width: 2; 5 | fill: none; 6 | } 7 | 8 | .axis path, 9 | .axis line { 10 | fill: none; 11 | stroke: grey; 12 | stroke-width: 1; 13 | shape-rendering: crispEdges; 14 | } 15 | } -------------------------------------------------------------------------------- /www/base/src/app/common/directives/properties/properties.tpl.jade: -------------------------------------------------------------------------------- 1 | table.table.table-hover.table-striped.table-condensed 2 | thead 3 | tr 4 | th.text-left Name 5 | th.text-center Value 6 | th.text-right Source 7 | tbody 8 | tr(ng-repeat="(name, value) in properties | publicFields") 9 | td.text-left {{ name }} 10 | td.text-left 11 | pre(style="vertical-align:top; padding:unset; margin:unset; display:inline-block; border:unset; background-color:unset") 12 | | {{ value[0] | json }} 13 | i.fa.fa-copy.clickable(style="vertical-align:top; padding:0 0.5ex" ng-click="copy(value[0])") 14 | td.text-right {{ value[1] }} 15 | -------------------------------------------------------------------------------- /www/base/src/app/common/directives/rawdata/rawdata.directive.js: -------------------------------------------------------------------------------- 1 | class Rawdata { 2 | constructor(RecursionHelper) { 3 | return { 4 | replace: true, 5 | restrict: 'E', 6 | scope: {data:'='}, 7 | template: require('./rawdata.tpl.jade'), 8 | compile: RecursionHelper.compile, 9 | controller: '_rawdataController' 10 | }; 11 | } 12 | } 13 | 14 | class _rawdata { 15 | constructor($scope) { 16 | $scope.isObject = v => _.isObject(v) && !_.isArray(v); 17 | $scope.isArrayOfObjects = v => _.isArray(v) && (v.length > 0) && _.isObject(v[0]); 18 | } 19 | } 20 | 21 | angular.module('common') 22 | .directive('rawdata', ['RecursionHelper', Rawdata]) 23 | .controller('_rawdataController', ['$scope', _rawdata]); 24 | -------------------------------------------------------------------------------- /www/base/src/app/common/directives/rawdata/rawdata.tpl.jade: -------------------------------------------------------------------------------- 1 | dl.dl-horizontal 2 | div(ng-if="v !== undefined", ng-repeat="(k,v) in data._raw_data ? data._raw_data : data") 3 | dt {{k}} 4 | dd(ng-if="!isObject(v) && !isArrayOfObjects(v)") {{v}}  5 | dd(ng-if="isArrayOfObjects(v)") 6 | i.fa.fa-chevron-circle-right.rotate(ng-class="{'fa-rotate-90':expanded}", ng-click="expanded = !expanded") 7 | ul(ng-if="expanded") 8 | li(ng-repeat="(kk,vv) in v") 9 | rawdata(data="vv") 10 | span(ng-if="!expanded") {{v}} 11 | dd(ng-if="isObject(v)") 12 | i.fa.fa-chevron-circle-right.rotate(ng-class="{'fa-rotate-90':expanded}", ng-click="expanded = !expanded") 13 | div(ng-if="expanded") 14 | rawdata(data="v") 15 | -------------------------------------------------------------------------------- /www/base/src/app/common/filters/encodeURI.filter.js: -------------------------------------------------------------------------------- 1 | var encodeURI = function ($filter) { 2 | function encodeURI(input) { 3 | return window.encodeURIComponent((input == null) ? "" : input); 4 | } 5 | return encodeURI; 6 | } 7 | 8 | angular.module('common') 9 | .filter('encodeURI', ['$filter', encodeURI]); 10 | -------------------------------------------------------------------------------- /www/base/src/app/common/filters/limitStringLength.filter.js: -------------------------------------------------------------------------------- 1 | var limitStringLength = function ($filter) { 2 | function limitStringLength(input, limit) { 3 | var newContent = $filter('limitTo')(input, limit); 4 | if(input.length > limit) { newContent += ' ...'; } 5 | return newContent; 6 | } 7 | return limitStringLength; 8 | } 9 | 10 | angular.module('common') 11 | .filter('limitStringLengthTo', ['$filter', limitStringLength]); 12 | -------------------------------------------------------------------------------- /www/base/src/app/common/filters/moment/moment.constant.js: -------------------------------------------------------------------------------- 1 | 2 | import * as moment from 'moment'; 3 | 4 | angular.module("common").constant("MOMENT", moment); 5 | -------------------------------------------------------------------------------- /www/base/src/app/common/filters/publicFields.filter.js: -------------------------------------------------------------------------------- 1 | /* 2 | * decaffeinate suggestions: 3 | * DS207: Consider shorter variations of null checks 4 | * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md 5 | */ 6 | class PublicFields { 7 | constructor() { 8 | return function(object) { 9 | if ((object == null)) { 10 | return object; 11 | } 12 | if (object._publicfields == null) { object._publicfields = {}; } 13 | for (let k in object) { 14 | const v = object[k]; 15 | if ((k.indexOf('_') !== 0) && object.hasOwnProperty(k)) { 16 | object._publicfields[k] = v; 17 | } 18 | } 19 | return object._publicfields; 20 | }; 21 | } 22 | } 23 | 24 | 25 | angular.module('common') 26 | .filter('publicFields', [PublicFields]); 27 | -------------------------------------------------------------------------------- /www/base/src/app/d3.module.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/www/base/src/app/d3.module.js -------------------------------------------------------------------------------- /www/base/src/app/d3/d3.service.js: -------------------------------------------------------------------------------- 1 | /* 2 | * decaffeinate suggestions: 3 | * DS102: Remove unnecessary code created because of implicit returns 4 | * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md 5 | */ 6 | // Load d3 script via jquery 7 | // We load those 50kB+ only when needed by plugins 8 | // actually, this is loaded when someone is requiring DI of this service 9 | class D3 { 10 | constructor($document, $q, config, $rootScope) { 11 | const d = $q.defer(); 12 | 13 | import('d3').then(module => { 14 | d.resolve(module); 15 | }); 16 | 17 | return { 18 | get() { return d.promise; } 19 | }; 20 | } 21 | } 22 | 23 | 24 | angular.module('app') 25 | .service('d3Service', ['$document', '$q', 'config', '$rootScope', D3]); 26 | -------------------------------------------------------------------------------- /www/base/src/app/home/home.tpl.jade: -------------------------------------------------------------------------------- 1 | .container 2 | .row(ng-if="config.buildbotURL != baseurl") 3 | .alert.alert-danger Warning: 4 | | c['buildbotURL'] is misconfigured to 5 | pre {{config.buildbotURL}} 6 | | Should be: 7 | pre {{baseurl}} 8 | span(ng-show='mainRunningBuilds.length>0') 9 | h4 Current builds: 10 | builds-table(builder="mainBuilder", builds="mainRunningBuilds") 11 | span(ng-show='publishBuilds.length>0') 12 | h4 Publishing: 13 | builds-table(builder="publishBuilder", builds="publishBuilds") 14 | span(ng-show='purgeBuilds.length>0') 15 | h4 Deleting: 16 | builds-table(builder="purgeBuilder", builds="purgeBuilds") 17 | span(ng-show='mainUpublishedBuilds.length>0') 18 | h4 Unpublished builds: 19 | builds-table(builder="mainBuilder", builds="mainUpublishedBuilds") 20 | h4 Recent builds: 21 | builds-table(builder="builders", builds="mainRecentBuilds") 22 | -------------------------------------------------------------------------------- /www/base/src/app/index.jade: -------------------------------------------------------------------------------- 1 | extends layout.jade 2 | block content 3 | gl-page-with-sidebar 4 | gl-topbar 5 | gl-topbar-contextual-actions 6 | loginbar 7 | connectionstatus 8 | ui-view 9 | -------------------------------------------------------------------------------- /www/base/src/app/masters/master/master.route.js: -------------------------------------------------------------------------------- 1 | // TODO master route 2 | ({ 3 | buildmaster: { 4 | url: '/buildmasters/:buildmaster', 5 | tabid: 'buildmasters' 6 | } 7 | }); 8 | -------------------------------------------------------------------------------- /www/base/src/app/masters/masters.route.js: -------------------------------------------------------------------------------- 1 | class MastersState { 2 | constructor($stateProvider) { 3 | 4 | // Name of the state 5 | const name = 'masters'; 6 | 7 | // Menu configuration 8 | const cfg = { 9 | group: "builds", 10 | caption: 'Build Masters' 11 | }; 12 | 13 | // Register new state 14 | $stateProvider.state({ 15 | controller: `${name}Controller`, 16 | template: require('./masters.tpl.jade'), 17 | name, 18 | url: '/masters', 19 | data: cfg 20 | }); 21 | 22 | // master page is actually same as masters, just filtered 23 | $stateProvider.state({ 24 | controller: `${name}Controller`, 25 | template: require('./masters.tpl.jade'), 26 | name: 'master', 27 | url: '/masters/:master', 28 | data: {}}); 29 | } 30 | } 31 | 32 | 33 | angular.module('app') 34 | .config(['$stateProvider', MastersState]); 35 | -------------------------------------------------------------------------------- /www/base/src/app/schedulers/schedulers.controller.js: -------------------------------------------------------------------------------- 1 | /* 2 | * decaffeinate suggestions: 3 | * DS102: Remove unnecessary code created because of implicit returns 4 | * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md 5 | */ 6 | class schedulers { 7 | constructor($log, $scope, $location, dataService) { 8 | const data = dataService.open().closeOnDestroy($scope); 9 | $scope.schedulers = data.getSchedulers(); 10 | 11 | $scope.change = function(s) { 12 | const newValue = s.enabled; 13 | const param = {enabled: newValue}; 14 | return dataService.control('schedulers', s.schedulerid, 'enable', param); 15 | }; 16 | } 17 | } 18 | 19 | 20 | angular.module('app') 21 | .controller('schedulersController', ['$log', '$scope', '$location', 'dataService', schedulers]); 22 | -------------------------------------------------------------------------------- /www/base/src/app/schedulers/schedulers.route.js: -------------------------------------------------------------------------------- 1 | class SchedulersState { 2 | constructor($stateProvider) { 3 | 4 | // Name of the state 5 | const name = 'schedulers'; 6 | 7 | // Configuration 8 | const cfg = { 9 | group: "builds", 10 | caption: 'Schedulers' 11 | }; 12 | 13 | // Register new state 14 | $stateProvider.state({ 15 | controller: `${name}Controller`, 16 | template: require('./schedulers.tpl.jade'), 17 | name, 18 | url: '/schedulers', 19 | data: cfg 20 | }); 21 | } 22 | } 23 | 24 | 25 | angular.module('app') 26 | .config(['$stateProvider', SchedulersState]); 27 | -------------------------------------------------------------------------------- /www/base/src/app/settings/settings.route.js: -------------------------------------------------------------------------------- 1 | class Settings { 2 | constructor($stateProvider, glMenuServiceProvider) { 3 | 4 | // Name of the state 5 | const name = 'settings'; 6 | 7 | // Menu configuration 8 | glMenuServiceProvider.addGroup({ 9 | name, 10 | caption: 'Settings', 11 | icon: 'sliders', 12 | order: 99 13 | }); 14 | 15 | // Configuration 16 | const cfg = { 17 | group: name, 18 | caption: 'Settings' 19 | }; 20 | 21 | // Register new state 22 | const state = { 23 | controller: `${name}Controller`, 24 | template: require('./settings.tpl.jade'), 25 | name, 26 | url: '/settings', 27 | data: cfg 28 | }; 29 | 30 | $stateProvider.state(state); 31 | } 32 | } 33 | 34 | angular.module('app') 35 | .config(['$stateProvider', 'glMenuServiceProvider', Settings]); 36 | -------------------------------------------------------------------------------- /www/base/src/app/workers/worker/worker.route.js: -------------------------------------------------------------------------------- 1 | // TODO worker route 2 | ({ 3 | worker: { 4 | url: '/workers/:workerid' 5 | } 6 | }); 7 | -------------------------------------------------------------------------------- /www/base/src/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/www/base/src/img/favicon.ico -------------------------------------------------------------------------------- /www/base/src/img/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/www/base/src/img/icon.png -------------------------------------------------------------------------------- /www/base/src/img/icon16.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /www/base/src/img/nobody.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/www/base/src/img/nobody.png -------------------------------------------------------------------------------- /www/base/src/styles/mobile.less: -------------------------------------------------------------------------------- 1 | /* mobile tweaks 2 | 3 | Reduce a bit more the font sizes and paddings the make more stuff in the screen, trading a bit of uglyness... 4 | */ 5 | @media (max-width: 600px) { 6 | .navbar .breadcrumb { 7 | font-size: 12px !important;; 8 | } 9 | .container, .container-fluid, .panel-heading, .list-group-item { 10 | padding-left: 5px !important; 11 | padding-right: 5px !important; 12 | } 13 | .navbar { 14 | .container, .container-fluid { 15 | padding-left: 15px !important; 16 | padding-right: 15px !important; 17 | } 18 | } 19 | .nav.nav-tabs > li > a { 20 | padding: 5px !important; 21 | font-size: 12px !important; 22 | } 23 | .logline { 24 | height: 12px !important;; 25 | font-size: 10px !important; 26 | } 27 | .nomobile{ display: None} 28 | } 29 | -------------------------------------------------------------------------------- /www/base/src/tests.webpack.js: -------------------------------------------------------------------------------- 1 | // This file is an entry point for angular tests 2 | // Avoids some weird issues when using webpack + angular. 3 | 4 | import 'angular'; 5 | import 'angular-mocks/angular-mocks'; 6 | import './app/app.module.js' 7 | import '../test/scripts/mocks/config.mock.js' 8 | 9 | const context = require.context('./', true, /\.spec.js$/); 10 | context.keys().forEach(context); 11 | -------------------------------------------------------------------------------- /www/base/test/scripts/mocks/config.mock.js: -------------------------------------------------------------------------------- 1 | angular.module("buildbot_config", []).constant("config", { 2 | title: "foo", 3 | buildbotURL: "test.example.com", 4 | }); 5 | -------------------------------------------------------------------------------- /www/build_common/src/main.module.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = { 4 | ...require('./karma.js'), 5 | ...require('./webpack.js'), 6 | }; 7 | -------------------------------------------------------------------------------- /www/build_common/src/ng-template-loader.js: -------------------------------------------------------------------------------- 1 | const pug = require('pug'); 2 | const path = require('path') 3 | var loaderUtils = require("loader-utils"); 4 | 5 | /* ultra simple loader that only support our simple usecase 6 | pug-loader is much more complicated, but do support lot of features, 7 | including require inside template, which we don't really need. 8 | */ 9 | 10 | module.exports = function() { 11 | var fileName = this.resourcePath; 12 | var code = pug.compileFile(fileName); 13 | var content = code(); 14 | var pluginName = loaderUtils.getOptions(this).pluginName; 15 | 16 | // compute template name (as defined by ancient gulp based build system) 17 | var tplName = "views/" + path.parse(fileName).name.replace(/.tpl$/,'') + ".html"; 18 | if (pluginName != "buildbot-www") { 19 | tplName = pluginName + "/" + tplName; 20 | } 21 | // search for custom_templates (we use T as a short name to avoid consume to much bytes) 22 | content = `module.exports = window.T['${tplName}'] || ${JSON.stringify(content)};`; 23 | return content; 24 | } -------------------------------------------------------------------------------- /www/codeparameter/karma.conf.js: -------------------------------------------------------------------------------- 1 | const common = require('buildbot-build-common'); 2 | 3 | module.exports = function karmaConfig (config) { 4 | common.createTemplateKarmaConfig(config, { 5 | testRoot: 'src/tests.webpack.js', 6 | webpack: require('./webpack.config') 7 | }); 8 | }; 9 | -------------------------------------------------------------------------------- /www/codeparameter/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "codeparameter", 3 | "private": true, 4 | "main": "buildbot_codeparameter/static/scripts.js", 5 | "scripts": { 6 | "build": "rimraf buildbot_codeparameter/static && webpack --bail --progress --profile --env prod", 7 | "build-dev": "rimraf buildbot_codeparameter/static && webpack --bail --progress --profile --env dev", 8 | "dev": "webpack --bail --progress --profile --watch --env dev", 9 | "test": "karma start", 10 | "test-watch": "karma start --auto-watch --no-single-run" 11 | }, 12 | "devDependencies": { 13 | "angular-mocks": "^1.7.9", 14 | "buildbot-build-common": "link:../build_common", 15 | "lodash": "^4.17.19", 16 | "rimraf": "^2.6.3", 17 | "style-loader": "^0.23.1" 18 | }, 19 | "dependencies": { 20 | "ace-builds": "^1.4.4", 21 | "angular": "^1.8.0", 22 | "angular-ui-ace": "^0.2.3", 23 | "angular-ui-bootstrap": "^2.5.6", 24 | "jquery": "^3.5.0" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /www/codeparameter/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | autoprefixer: { 4 | browsers: ['last 2 versions'] 5 | }, 6 | }, 7 | }; 8 | -------------------------------------------------------------------------------- /www/codeparameter/setup.cfg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/www/codeparameter/setup.cfg -------------------------------------------------------------------------------- /www/codeparameter/src/module/codefield.directive.js: -------------------------------------------------------------------------------- 1 | 2 | // defines custom field directives which only have templates 3 | class Codefield { 4 | constructor() { 5 | return { 6 | replace: false, 7 | restrict: 'E', 8 | scope: false, 9 | template: require('./codefield.tpl.jade') 10 | }; 11 | } 12 | } 13 | 14 | angular.module('codeparameter') 15 | .directive('codefield', [Codefield]); 16 | -------------------------------------------------------------------------------- /www/codeparameter/src/module/codefield.tpl.jade: -------------------------------------------------------------------------------- 1 | basefield 2 | div.form 3 | label.control-label.col-sm-12(for="{{field.name}}") 4 | | {{field.label}} 5 | .col-sm-12 6 | div(style="height:{{field.height}}px", ui-ace="{mode:field.mode}", readonly="field.readonly", 7 | ng-model="field.value") 8 | -------------------------------------------------------------------------------- /www/codeparameter/src/module/main.module.js: -------------------------------------------------------------------------------- 1 | 2 | import 'ace-builds/src-noconflict/ace'; 3 | import "ace-builds/webpack-resolver"; 4 | import 'angular-ui-ace'; 5 | 6 | angular.module("codeparameter", ['ui.ace', 'common']); 7 | 8 | require('./codefield.directive.js'); 9 | -------------------------------------------------------------------------------- /www/codeparameter/src/styles/styles.less: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/www/codeparameter/src/styles/styles.less -------------------------------------------------------------------------------- /www/codeparameter/src/tests.webpack.js: -------------------------------------------------------------------------------- 1 | // This file is an entry point for angular tests 2 | // Avoids some weird issues when using webpack + angular. 3 | 4 | import 'angular'; 5 | import 'angular-mocks/angular-mocks'; 6 | import './module/main.module.js' 7 | 8 | const context = require.context('./', true, /\.spec.js$/); 9 | context.keys().forEach(context); 10 | -------------------------------------------------------------------------------- /www/codeparameter/webpack.config.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const common = require('buildbot-build-common'); 4 | const env = require('yargs').argv.env; 5 | const pkg = require('./package.json'); 6 | 7 | var event = process.env.npm_lifecycle_event; 8 | 9 | var isTest = event === 'test' || event === 'test-watch'; 10 | var isProd = env === 'prod'; 11 | 12 | module.exports = function() { 13 | return common.createTemplateWebpackConfig({ 14 | entry: { 15 | scripts: './src/module/main.module.js', 16 | }, 17 | libraryName: pkg.name, 18 | pluginName: pkg.plugin_name, 19 | dirname: __dirname, 20 | isTest: isTest, 21 | isProd: isProd, 22 | outputPath: __dirname + '/buildbot_codeparameter/static', 23 | provideJquery: true, 24 | }); 25 | }(); 26 | -------------------------------------------------------------------------------- /www/console_view/buildbot_console_view/__init__.py: -------------------------------------------------------------------------------- 1 | # This file is part of Buildbot. Buildbot is free software: you can 2 | # redistribute it and/or modify it under the terms of the GNU General Public 3 | # License as published by the Free Software Foundation, version 2. 4 | # 5 | # This program is distributed in the hope that it will be useful, but WITHOUT 6 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 7 | # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 8 | # details. 9 | # 10 | # You should have received a copy of the GNU General Public License along with 11 | # this program; if not, write to the Free Software Foundation, Inc., 51 12 | # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 13 | # 14 | # Copyright Buildbot Team Members 15 | 16 | from buildbot.www.plugin import Application 17 | 18 | # create the interface for the setuptools entry point 19 | ep = Application(__name__, "Buildbot Console View UI") 20 | -------------------------------------------------------------------------------- /www/console_view/karma.conf.js: -------------------------------------------------------------------------------- 1 | const common = require('buildbot-build-common'); 2 | 3 | module.exports = function karmaConfig (config) { 4 | common.createTemplateKarmaConfig(config, { 5 | testRoot: 'src/tests.webpack.js', 6 | webpack: require('./webpack.config') 7 | }); 8 | }; 9 | -------------------------------------------------------------------------------- /www/console_view/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | autoprefixer: { 4 | browsers: ['last 2 versions'] 5 | }, 6 | }, 7 | }; 8 | -------------------------------------------------------------------------------- /www/console_view/setup.cfg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/www/console_view/setup.cfg -------------------------------------------------------------------------------- /www/console_view/src/module/view/modal/modal.controller.js: -------------------------------------------------------------------------------- 1 | /* 2 | * decaffeinate suggestions: 3 | * DS102: Remove unnecessary code created because of implicit returns 4 | * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md 5 | */ 6 | class ConsoleModal { 7 | constructor($scope, $uibModalInstance, selectedBuild) { 8 | this.$uibModalInstance = $uibModalInstance; 9 | this.selectedBuild = selectedBuild; 10 | $scope.$on('$stateChangeStart', () => { 11 | return this.close(); 12 | }); 13 | } 14 | 15 | close() { 16 | return this.$uibModalInstance.close(); 17 | } 18 | } 19 | 20 | 21 | angular.module('console_view') 22 | .controller('consoleModalController', ['$scope', '$uibModalInstance', 'selectedBuild', ConsoleModal]); 23 | -------------------------------------------------------------------------------- /www/console_view/src/module/view/modal/modal.style.less: -------------------------------------------------------------------------------- 1 | .modal-big { 2 | .modal-dialog { 3 | width: 80%; 4 | } 5 | 6 | .fa { 7 | cursor: pointer; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /www/console_view/src/module/view/modal/modal.tpl.jade: -------------------------------------------------------------------------------- 1 | // Show build summary for the selected build in a modal window 2 | .modal-header 3 | i.fa.fa-times.pull-right(ng-click='modal.close()') 4 | h4.modal-title Build summary 5 | .modal-body 6 | buildsummary(ng-if='modal.selectedBuild' buildid='modal.selectedBuild.buildid') -------------------------------------------------------------------------------- /www/console_view/src/tests.webpack.js: -------------------------------------------------------------------------------- 1 | // This file is an entry point for angular tests 2 | // Avoids some weird issues when using webpack + angular. 3 | 4 | import 'angular'; 5 | import 'angular-mocks/angular-mocks'; 6 | import './module/main.module.js' 7 | 8 | const context = require.context('./', true, /\.spec.js$/); 9 | context.keys().forEach(context); 10 | -------------------------------------------------------------------------------- /www/console_view/test/main.js: -------------------------------------------------------------------------------- 1 | // app module is necessary for plugins, but only in the test environment 2 | angular.module("app", []).constant("config", {"url": "foourl"}); 3 | -------------------------------------------------------------------------------- /www/console_view/webpack.config.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const common = require('buildbot-build-common'); 4 | const env = require('yargs').argv.env; 5 | const pkg = require('./package.json'); 6 | 7 | var event = process.env.npm_lifecycle_event; 8 | 9 | var isTest = event === 'test' || event === 'test-watch'; 10 | var isProd = env === 'prod'; 11 | 12 | module.exports = function() { 13 | return common.createTemplateWebpackConfig({ 14 | entry: { 15 | scripts: './src/module/main.module.js', 16 | styles: './src/styles/styles.less', 17 | }, 18 | libraryName: pkg.name, 19 | pluginName: pkg.plugin_name, 20 | dirname: __dirname, 21 | isTest: isTest, 22 | isProd: isProd, 23 | outputPath: __dirname + '/buildbot_console_view/static', 24 | extractStyles: true, 25 | }); 26 | }(); 27 | -------------------------------------------------------------------------------- /www/data_module/karma.conf.js: -------------------------------------------------------------------------------- 1 | const common = require('buildbot-build-common'); 2 | 3 | module.exports = function karmaConfig (config) { 4 | common.createTemplateKarmaConfig(config, { 5 | testRoot: 'src/tests.webpack.js', 6 | webpack: require('./webpack.config') 7 | }); 8 | }; 9 | -------------------------------------------------------------------------------- /www/data_module/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "buildbot-data-js", 3 | "version": "3.0.1", 4 | "description": "Buildbot AngularJS data module", 5 | "readme": "README.md", 6 | "author": "Andras Toth ", 7 | "main": "dist/buildbot-data-js.js", 8 | "scripts": { 9 | "build": "rimraf dist && webpack --bail --progress --profile --env dev && webpack --bail --progress --profile --env prod", 10 | "build-dev": "rimraf dist && webpack --bail --progress --profile --env dev", 11 | "test": "karma start", 12 | "test-watch": "karma start --auto-watch --no-single-run" 13 | }, 14 | "devDependencies": { 15 | "angular-mocks": "^1.7.9", 16 | "buildbot-build-common": "link:../build_common", 17 | "rimraf": "^2.6.3" 18 | }, 19 | "dependencies": { 20 | "angular": "^1.7.9" 21 | }, 22 | "license": "MIT" 23 | } 24 | -------------------------------------------------------------------------------- /www/data_module/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | autoprefixer: { 4 | browsers: ['last 2 versions'] 5 | }, 6 | }, 7 | }; 8 | -------------------------------------------------------------------------------- /www/data_module/src/classes/build.service.js: -------------------------------------------------------------------------------- 1 | class Build { 2 | constructor(Base, dataService) { 3 | let BuildInstance; 4 | return (BuildInstance = class BuildInstance extends Base { 5 | constructor(object, endpoint) { 6 | const endpoints = [ 7 | 'changes', // /changes 8 | 'properties', // /properties 9 | 'steps' // /steps/:name 10 | // /steps/:stepid 11 | ]; 12 | 13 | super(object, endpoint, endpoints); 14 | } 15 | }); 16 | } 17 | } 18 | 19 | 20 | angular.module('bbData') 21 | .factory('Build', ['Base', 'dataService', Build]); 22 | -------------------------------------------------------------------------------- /www/data_module/src/classes/builder.service.js: -------------------------------------------------------------------------------- 1 | class Builder { 2 | constructor(Base, dataService) { 3 | let BuilderInstance; 4 | return (BuilderInstance = class BuilderInstance extends Base { 5 | constructor(object, endpoint) { 6 | const endpoints = [ 7 | 'builds', // /builds/:buildid 8 | 'buildrequests', // /buildrequests/:buildrequestid 9 | 'forceschedulers', // /forceschedulers 10 | 'workers', // /workers/:workerid 11 | // /workers/:name 12 | 'masters' // /masters/:masterid 13 | ]; 14 | 15 | super(object, endpoint, endpoints); 16 | } 17 | }); 18 | } 19 | } 20 | 21 | 22 | angular.module('bbData') 23 | .factory('Builder', ['Base', 'dataService', Builder]); 24 | -------------------------------------------------------------------------------- /www/data_module/src/classes/buildrequest.service.js: -------------------------------------------------------------------------------- 1 | class Buildrequest { 2 | constructor(Base, dataService) { 3 | let BuildrequestInstance; 4 | return (BuildrequestInstance = class BuildrequestInstance extends Base { 5 | constructor(object, endpoint) { 6 | const endpoints = [ 7 | 'builds' // /builds 8 | ]; 9 | 10 | super(object, endpoint, endpoints); 11 | } 12 | }); 13 | } 14 | } 15 | 16 | 17 | angular.module('bbData') 18 | .factory('Buildrequest', ['Base', 'dataService', Buildrequest]); 19 | -------------------------------------------------------------------------------- /www/data_module/src/classes/buildset.service.js: -------------------------------------------------------------------------------- 1 | class Buildset { 2 | constructor(Base, dataService) { 3 | let BuildsetInstance; 4 | return (BuildsetInstance = class BuildsetInstance extends Base { 5 | constructor(object, endpoint) { 6 | const endpoints = [ 7 | 'properties' // /properties 8 | ]; 9 | 10 | super(object, endpoint, endpoints); 11 | } 12 | }); 13 | } 14 | } 15 | 16 | 17 | angular.module('bbData') 18 | .factory('Buildset', ['Base', 'dataService', Buildset]); 19 | -------------------------------------------------------------------------------- /www/data_module/src/classes/changes.spec.js: -------------------------------------------------------------------------------- 1 | describe('change class', function() { 2 | beforeEach(angular.mock.module('bbData')); 3 | 4 | it('should calculate authors emails', inject(function(Change) { 5 | const changes = [ 6 | new Change({author: "foo "}, "changes") 7 | , 8 | new Change({author: "foo@foo.com"}, "changes") 9 | , 10 | new Change({author: "foo"}, "changes") 11 | ]; 12 | expect(changes[0].author_email).toBe("bar@foo.com"); 13 | expect(changes[1].author_email).toBe("foo@foo.com"); 14 | expect(changes[2].author_email).toBeUndefined(); 15 | expect(changes[0].author_name).toBe("foo"); 16 | expect(changes[1].author_name).toBe("foo"); 17 | expect(changes[2].author_name).toBe("foo"); 18 | }) 19 | ); 20 | }); 21 | -------------------------------------------------------------------------------- /www/data_module/src/classes/changesource.service.js: -------------------------------------------------------------------------------- 1 | class Changesource { 2 | constructor(dataService, Base) { 3 | let ChangesourceInstance; 4 | return (ChangesourceInstance = class ChangesourceInstance extends Base { 5 | constructor(object, endpoint) { 6 | super(object, endpoint); 7 | } 8 | }); 9 | } 10 | } 11 | 12 | 13 | angular.module('bbData') 14 | .factory('Changesource', ['dataService', 'Base', Changesource]); 15 | -------------------------------------------------------------------------------- /www/data_module/src/classes/forcescheduler.service.js: -------------------------------------------------------------------------------- 1 | class Forcescheduler { 2 | constructor(Base, dataService) { 3 | let ForceschedulerInstance; 4 | return (ForceschedulerInstance = class ForceschedulerInstance extends Base { 5 | constructor(object, endpoint) { 6 | super(object, endpoint); 7 | } 8 | }); 9 | } 10 | } 11 | 12 | 13 | angular.module('bbData') 14 | .factory('Forcescheduler', ['Base', 'dataService', Forcescheduler]); 15 | -------------------------------------------------------------------------------- /www/data_module/src/classes/logs.service.js: -------------------------------------------------------------------------------- 1 | class Log { 2 | constructor(Base, dataService) { 3 | let BuildInstance; 4 | return (BuildInstance = class BuildInstance extends Base { 5 | constructor(object, endpoint) { 6 | const endpoints = [ 7 | 'chunks', // /chunks 8 | 'contents' 9 | ]; 10 | super(object, endpoint, endpoints); 11 | } 12 | }); 13 | } 14 | } 15 | 16 | 17 | angular.module('bbData') 18 | .factory('Log', ['Base', 'dataService', Log]); 19 | -------------------------------------------------------------------------------- /www/data_module/src/classes/master.service.js: -------------------------------------------------------------------------------- 1 | class Master { 2 | constructor(Base, dataService) { 3 | let MasterInstance; 4 | return (MasterInstance = class MasterInstance extends Base { 5 | constructor(object, endpoint) { 6 | const endpoints = [ 7 | 'builders', // /builders/:builderid 8 | 'workers', // /workers/:workerid 9 | // /workers/:name 10 | 'changesources', // /changesources/:changesourceid 11 | 'schedulers' // /schedulers/:schedulerid 12 | ]; 13 | 14 | super(object, endpoint, endpoints); 15 | } 16 | }); 17 | } 18 | } 19 | 20 | 21 | angular.module('bbData') 22 | .factory('Master', ['Base', 'dataService', Master]); 23 | -------------------------------------------------------------------------------- /www/data_module/src/classes/properties.service.js: -------------------------------------------------------------------------------- 1 | // damn grammar. I claim that properties singular is propertie 2 | class Propertie { 3 | constructor(Base, dataService) { 4 | let BuildInstance; 5 | return (BuildInstance = class BuildInstance extends Base { 6 | constructor(object, endpoint) { 7 | super(object, endpoint, []); 8 | } 9 | }); 10 | } 11 | } 12 | 13 | 14 | angular.module('bbData') 15 | .factory('Propertie', ['Base', 'dataService', Propertie]); 16 | -------------------------------------------------------------------------------- /www/data_module/src/classes/scheduler.service.js: -------------------------------------------------------------------------------- 1 | class Scheduler { 2 | constructor(Base, dataService) { 3 | let SchedulerInstance; 4 | return (SchedulerInstance = class SchedulerInstance extends Base { 5 | constructor(object, endpoint) { 6 | super(object, endpoint); 7 | } 8 | }); 9 | } 10 | } 11 | 12 | 13 | angular.module('bbData') 14 | .factory('Scheduler', ['Base', 'dataService', Scheduler]); 15 | -------------------------------------------------------------------------------- /www/data_module/src/classes/sourcestamp.service.js: -------------------------------------------------------------------------------- 1 | class Sourcestamp { 2 | constructor(Base, dataService) { 3 | let SourcestampInstance; 4 | return (SourcestampInstance = class SourcestampInstance extends Base { 5 | constructor(object, endpoint) { 6 | const endpoints = [ 7 | 'changes' // /changes 8 | ]; 9 | 10 | super(object, endpoint, endpoints); 11 | } 12 | }); 13 | } 14 | } 15 | 16 | 17 | angular.module('bbData') 18 | .factory('Sourcestamp', ['Base', 'dataService', Sourcestamp]); 19 | -------------------------------------------------------------------------------- /www/data_module/src/classes/step.service.js: -------------------------------------------------------------------------------- 1 | class Step { 2 | constructor(Base, dataService) { 3 | let BuildInstance; 4 | return (BuildInstance = class BuildInstance extends Base { 5 | constructor(object, endpoint) { 6 | const endpoints = [ 7 | 'logs' // /logs 8 | ]; 9 | 10 | super(object, endpoint, endpoints); 11 | } 12 | }); 13 | } 14 | } 15 | 16 | 17 | angular.module('bbData') 18 | .factory('Step', ['Base', 'dataService', Step]); 19 | -------------------------------------------------------------------------------- /www/data_module/src/classes/worker.service.js: -------------------------------------------------------------------------------- 1 | class Worker { 2 | constructor(Base, dataService) { 3 | let WorkerInstance; 4 | return (WorkerInstance = class WorkerInstance extends Base { 5 | constructor(object, endpoint) { 6 | super(object, endpoint); 7 | } 8 | }); 9 | } 10 | } 11 | 12 | 13 | angular.module('bbData') 14 | .factory('Worker', ['Base', 'dataService', Worker]); 15 | -------------------------------------------------------------------------------- /www/data_module/src/data.constant.js: -------------------------------------------------------------------------------- 1 | class Api { 2 | constructor() { return new String('api/v2/'); } 3 | } 4 | 5 | class Endpoints { 6 | constructor() { 7 | // Rootlinks 8 | return [ 9 | 'builders', 10 | 'builds', 11 | 'buildrequests', 12 | 'workers', 13 | 'buildsets', 14 | 'changes', 15 | 'changesources', 16 | 'masters', 17 | 'sourcestamps', 18 | 'schedulers', 19 | 'forceschedulers' 20 | ]; 21 | } 22 | } 23 | 24 | 25 | angular.module('bbData') 26 | .constant('API', new Api()) 27 | .constant('ENDPOINTS', new Endpoints()); 28 | -------------------------------------------------------------------------------- /www/data_module/src/tests.webpack.js: -------------------------------------------------------------------------------- 1 | // This file is an entry point for angular tests 2 | // Avoids some weird issues when using webpack + angular. 3 | 4 | import 'angular'; 5 | import 'angular-mocks/angular-mocks'; 6 | import './data.module.js' 7 | 8 | const context = require.context('./', true, /\.spec.js$/); 9 | 10 | context.keys().forEach(context); 11 | -------------------------------------------------------------------------------- /www/data_module/webpack.config.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const common = require('buildbot-build-common'); 4 | const env = require('yargs').argv.env; 5 | const pkg = require('./package.json'); 6 | 7 | var event = process.env.npm_lifecycle_event; 8 | 9 | var isTest = event === 'test' || event === 'test-watch'; 10 | var isProd = env === 'prod'; 11 | 12 | module.exports = function() { 13 | var basename = isProd ? pkg.name + '.min' : pkg.name; 14 | 15 | return common.createTemplateWebpackConfig({ 16 | entry: { 17 | [basename]: './src/data.module.js', 18 | }, 19 | libraryName: pkg.name, 20 | pluginName: pkg.plugin_name, 21 | dirname: __dirname, 22 | isTest: isTest, 23 | isProd: isProd, 24 | outputPath: __dirname + '/dist', 25 | }); 26 | }(); 27 | -------------------------------------------------------------------------------- /www/grid_view/buildbot_grid_view/__init__.py: -------------------------------------------------------------------------------- 1 | # This file is part of Buildbot. Buildbot is free software: you can 2 | # redistribute it and/or modify it under the terms of the GNU General Public 3 | # License as published by the Free Software Foundation, version 2. 4 | # 5 | # This program is distributed in the hope that it will be useful, but WITHOUT 6 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 7 | # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 8 | # details. 9 | # 10 | # You should have received a copy of the GNU General Public License along with 11 | # this program; if not, write to the Free Software Foundation, Inc., 51 12 | # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 13 | # 14 | # Copyright Buildbot Team Members 15 | 16 | from buildbot.www.plugin import Application 17 | 18 | # create the interface for the setuptools entry point 19 | ep = Application(__name__, "Buildbot Grid View plugin") 20 | -------------------------------------------------------------------------------- /www/grid_view/karma.conf.js: -------------------------------------------------------------------------------- 1 | const common = require('buildbot-build-common'); 2 | 3 | module.exports = function karmaConfig (config) { 4 | common.createTemplateKarmaConfig(config, { 5 | testRoot: 'src/tests.webpack.js', 6 | webpack: require('./webpack.config') 7 | }); 8 | }; 9 | -------------------------------------------------------------------------------- /www/grid_view/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | autoprefixer: { 4 | browsers: ['last 2 versions'] 5 | }, 6 | }, 7 | }; 8 | -------------------------------------------------------------------------------- /www/grid_view/setup.cfg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/www/grid_view/setup.cfg -------------------------------------------------------------------------------- /www/grid_view/src/styles/styles.less: -------------------------------------------------------------------------------- 1 | .grid { 2 | .load-indicator { 3 | width: 100%; 4 | height: 100%; 5 | z-index: 900; 6 | background-color: #ffffff; 7 | display: table; 8 | 9 | .spinner { 10 | display: table-cell; 11 | vertical-align: middle; 12 | text-align: center; 13 | 14 | p { 15 | font-weight: 300; 16 | margin-top: 10px; 17 | } 18 | } 19 | } 20 | .clickable { 21 | cursor: pointer; 22 | } 23 | .builder-tag { 24 | margin-right: 0.3em; 25 | margin-left: 0.3em; 26 | cursor: pointer; 27 | } 28 | .form-inline { 29 | label { 30 | padding-left: 0.5em; 31 | padding-right: 0.5em; 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /www/grid_view/src/tests.webpack.js: -------------------------------------------------------------------------------- 1 | // This file is an entry point for angular tests 2 | // Avoids some weird issues when using webpack + angular. 3 | 4 | import 'angular'; 5 | import 'angular-mocks/angular-mocks'; 6 | import './module/main.module.js' 7 | 8 | const context = require.context('./', true, /\.spec.js$/); 9 | context.keys().forEach(context); 10 | -------------------------------------------------------------------------------- /www/grid_view/test/main.js: -------------------------------------------------------------------------------- 1 | // app module is necessary for plugins, but only in the test environment 2 | angular.module("app", []).constant("config", {"url": "foourl"}); 3 | -------------------------------------------------------------------------------- /www/grid_view/webpack.config.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const common = require('buildbot-build-common'); 4 | const env = require('yargs').argv.env; 5 | const pkg = require('./package.json'); 6 | 7 | var event = process.env.npm_lifecycle_event; 8 | 9 | var isTest = event === 'test' || event === 'test-watch'; 10 | var isProd = env === 'prod'; 11 | 12 | module.exports = function() { 13 | return common.createTemplateWebpackConfig({ 14 | entry: { 15 | scripts: './src/module/main.module.js', 16 | styles: './src/styles/styles.less', 17 | }, 18 | libraryName: pkg.name, 19 | pluginName: pkg.plugin_name, 20 | dirname: __dirname, 21 | isTest: isTest, 22 | isProd: isProd, 23 | outputPath: __dirname + '/buildbot_grid_view/static', 24 | extractStyles: true, 25 | }); 26 | }(); 27 | -------------------------------------------------------------------------------- /www/guanlecoja-ui/.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | 3 | node_js: 4 | - 8 5 | 6 | before_install: 7 | - yarn global add gulp 8 | script: 9 | - gulp default 10 | - gulp prod 11 | - gulp prod --coverage 12 | -------------------------------------------------------------------------------- /www/guanlecoja-ui/karma.conf.js: -------------------------------------------------------------------------------- 1 | const common = require('buildbot-build-common'); 2 | 3 | module.exports = function karmaConfig (config) { 4 | common.createTemplateKarmaConfig(config, { 5 | testRoot: 'src/tests.webpack.js', 6 | webpack: require('./webpack.config') 7 | }); 8 | }; 9 | -------------------------------------------------------------------------------- /www/guanlecoja-ui/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | autoprefixer: { 4 | browsers: ['last 2 versions'] 5 | }, 6 | }, 7 | }; 8 | -------------------------------------------------------------------------------- /www/guanlecoja-ui/src/app/layout.jade: -------------------------------------------------------------------------------- 1 | doctype html 2 | html.no-js(xmlns:ng='http://angularjs.org', xmlns:app='ignored') 3 | head 4 | meta(charset='utf-8') 5 | meta(http-equiv='X-UA-Compatible', content='IE=edge,chrome=1') 6 | title guanlecoja ui demo 7 | meta(name='description', content='Guanlecoja UI demo') 8 | meta(name='viewport', content='initial-scale=1, minimum-scale=1, user-scalable=no, maximum-scale=1, width=device-width') 9 | link(rel='stylesheet', href='//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css') 10 | link(rel='stylesheet', href='//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css') 11 | link(rel='stylesheet', href='styles.css') 12 | 13 | body(ng-cloak, ng-app="app") 14 | block content 15 | block footer 16 | script(src="vendors.js") 17 | script(src="scripts.js") 18 | block scripts 19 | -------------------------------------------------------------------------------- /www/guanlecoja-ui/src/img/avatar.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/www/guanlecoja-ui/src/img/avatar.jpg -------------------------------------------------------------------------------- /www/guanlecoja-ui/src/module/breadcrumb_service/breadcrumb.service.js: -------------------------------------------------------------------------------- 1 | /* 2 | * decaffeinate suggestions: 3 | * DS102: Remove unnecessary code created because of implicit returns 4 | * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md 5 | */ 6 | // a simple service to abstract breadcrumb configuration 7 | class glBreadcrumb { 8 | constructor($rootScope) { 9 | this.$rootScope = $rootScope; 10 | } 11 | 12 | setBreadcrumb(breadcrumb) { 13 | this.$rootScope.$broadcast("glBreadcrumb", breadcrumb); 14 | } 15 | } 16 | 17 | angular.module('guanlecoja.ui') 18 | .service('glBreadcrumbService', ['$rootScope', glBreadcrumb]); 19 | -------------------------------------------------------------------------------- /www/guanlecoja-ui/src/module/breadcrumb_service/breadcrumb.service.spec.js: -------------------------------------------------------------------------------- 1 | /* 2 | * decaffeinate suggestions: 3 | * DS102: Remove unnecessary code created because of implicit returns 4 | * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md 5 | */ 6 | describe('breadcrumbService', function() { 7 | beforeEach(angular.mock.module("guanlecoja.ui")); 8 | 9 | // simple test to make sure the directive loads 10 | it('should forward call to setBreadcrumb via $broadcast', 11 | inject(function($rootScope, glBreadcrumbService) { 12 | let gotBreadcrumb = null; 13 | $rootScope.$on("glBreadcrumb", (e, data) => gotBreadcrumb = data); 14 | 15 | glBreadcrumbService.setBreadcrumb({foo:"bar"}); 16 | $rootScope.$digest(); 17 | expect(gotBreadcrumb).toEqual({foo:"bar"}); 18 | }) 19 | ); 20 | }); 21 | -------------------------------------------------------------------------------- /www/guanlecoja-ui/src/module/main.module.js: -------------------------------------------------------------------------------- 1 | import 'angular-animate'; 2 | import 'angular-ui-bootstrap'; 3 | import 'lodash'; 4 | import '@uirouter/angularjs'; 5 | 6 | if (window.T === undefined){ 7 | window.T = {} 8 | } 9 | angular.module("guanlecoja.ui", ["ui.bootstrap", "ui.router", "ngAnimate"]); 10 | 11 | require('./breadcrumb_service/breadcrumb.service.js'); 12 | require('./menu_service/menu.service.js'); 13 | require('./notification_service/httpinterceptor.js'); 14 | require('./notification_service/notification.service.js'); 15 | require('./notification_widget/notification.directive.js'); 16 | require('./page_with_sidebar/page_with_sidebar.directive.js'); 17 | require('./topbar-contextual-actions/topbar-contextual-actions.directive.js'); 18 | require('./topbar/topbar.directive.js'); 19 | 20 | -------------------------------------------------------------------------------- /www/guanlecoja-ui/src/module/notification_widget/notification.tpl.jade: -------------------------------------------------------------------------------- 1 | li.dropdown.notifications(uib-dropdown) 2 | a(uib-dropdown-toggle) 3 | i.fa.fa-bell-o.fa-lg(ng-class="{'fa-ringing': n.notifications.length > 0 }") 4 | ul.uib-dropdown-menu.dropdown-menu.dropdown-menu-right(dropdown-toggle) 5 | li.dropdown-header 6 | | Notifications 7 | li.divider 8 | div(ng-repeat="msg in n.notifications") 9 | li 10 | .item 11 | button.close(ng-click="n.dismiss(msg.id, $event)") × 12 | .title {{msg.title}}: 13 | .msg {{msg.msg}} 14 | li.divider 15 | li(ng-hide="n.notifications.length>0") 16 | .item 17 | small.msg all caught up! 18 | -------------------------------------------------------------------------------- /www/guanlecoja-ui/src/module/topbar-contextual-actions/topbar-contextual-actions.less: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/www/guanlecoja-ui/src/module/topbar-contextual-actions/topbar-contextual-actions.less -------------------------------------------------------------------------------- /www/guanlecoja-ui/src/module/topbar-contextual-actions/topbar-contextual-actions.tpl.jade: -------------------------------------------------------------------------------- 1 | form.navbar-form.navbar-left 2 | .form-group(ng-repeat="a in actions") 3 | button.btn.btn-default(type="button" ng-class="a.extra_class" ng-click="a.action()", title="{{a.help}}") 4 | i.fa(ng-if="a.icon", ng-class="'fa-' + a.icon") 5 | span(ng-if="a.icon&&a.caption")   6 | | {{::a.caption}} 7 | |   8 | -------------------------------------------------------------------------------- /www/guanlecoja-ui/src/module/topbar/topbar.tpl.jade: -------------------------------------------------------------------------------- 1 | nav.navbar.navbar-default 2 | .container-fluid 3 | .navbar-header 4 | button.navbar-toggle.collapsed( 5 | type="button", ng-click="collapse=!collapse", ng-init="collapse=1" aria-expanded="false") 6 | span.sr-only Toggle navigation 7 | span.icon-bar 8 | span.icon-bar 9 | span.icon-bar 10 | a.navbar-brand {{appTitle}} 11 | ol.breadcrumb 12 | li(ng-repeat="b in breadcrumb") 13 | a(ng-if="b.sref", ui-sref="{{b.sref}}") {{b.caption}} 14 | a(ng-if="b.href", ng-href="{{b.href}}") {{b.caption}} 15 | span(ng-if="b.href == undefined && b.sref == undefined", ng-href="{{b.href}}") {{b.caption}} 16 | .navbar-collapse.collapse.pull-right(ng-class='{"in": !collapse}') 17 | ul.nav.navbar-nav(ng-transclude) 18 | -------------------------------------------------------------------------------- /www/guanlecoja-ui/src/styles/styles.less: -------------------------------------------------------------------------------- 1 | /* Base */ 2 | 3 | @import "../module/**/*.less"; 4 | 5 | html { 6 | overflow-y: scroll; 7 | } 8 | .row { 9 | margin-left: 0; 10 | margin-right: 0; 11 | } 12 | .row > div { 13 | margin-bottom: 15px; 14 | } 15 | 16 | 17 | .noselect { 18 | -webkit-touch-callout: none; 19 | -webkit-user-select: none; 20 | -khtml-user-select: none; 21 | -moz-user-select: none; 22 | -ms-user-select: none; 23 | user-select: none; 24 | } 25 | -------------------------------------------------------------------------------- /www/guanlecoja-ui/src/tests.webpack.js: -------------------------------------------------------------------------------- 1 | // This file is an entry point for angular tests 2 | // Avoids some weird issues when using webpack + angular. 3 | 4 | import 'angular'; 5 | import 'angular-mocks/angular-mocks'; 6 | import './module/main.module.js' 7 | 8 | const context = require.context('./', true, /\.spec.js$/); 9 | context.keys().forEach(context); 10 | -------------------------------------------------------------------------------- /www/guanlecoja-ui/webpack.config.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const common = require('buildbot-build-common'); 4 | const env = require('yargs').argv.env; 5 | const pkg = require('./package.json'); 6 | 7 | var event = process.env.npm_lifecycle_event; 8 | 9 | var isTest = event === 'test' || event === 'test-watch'; 10 | var isProd = env === 'prod'; 11 | 12 | module.exports = function() { 13 | var basename = isProd ? pkg.name + '.min' : pkg.name; 14 | 15 | return common.createTemplateWebpackConfig({ 16 | entry: { 17 | [basename]: './src/module/main.module.js', 18 | styles: './src/styles/styles.less', 19 | }, 20 | libraryName: pkg.name, 21 | pluginName: pkg.plugin_name, 22 | dirname: __dirname, 23 | isTest: isTest, 24 | isProd: isProd, 25 | outputPath: __dirname + '/dist', 26 | extractStyles: true, 27 | provideJquery: true, 28 | }); 29 | }(); 30 | -------------------------------------------------------------------------------- /www/nestedexample/buildbot_nestedexample/api.py: -------------------------------------------------------------------------------- 1 | 2 | import json 3 | 4 | from klein import Klein 5 | from twisted.internet import defer 6 | 7 | 8 | class Api: 9 | app = Klein() 10 | pizzaIngredients = {'margherita': ['tomato', 'ham', 'cheese'], 11 | 'regina': ['tomato', 'ham', 'cheese', 'mushrooms']} 12 | 13 | def __init__(self, ep): 14 | self.ep = ep 15 | 16 | @app.route("/getIngredients", methods=['GET']) 17 | def getIngredients(self, request): 18 | pizzaArgument = request.args.get('pizza') 19 | if pizzaArgument is None: 20 | return defer.succeed(json.dumps("invalid request")) 21 | pizza = pizzaArgument[0].lower() 22 | res = self.pizzaIngredients.get(pizza, 23 | ["only {} are supported " 24 | "for now".format(self.pizzaIngredients.keys())]) 25 | return defer.succeed(json.dumps(res)) 26 | -------------------------------------------------------------------------------- /www/nestedexample/gulpfile.js: -------------------------------------------------------------------------------- 1 | require("guanlecoja")(require("gulp")) 2 | -------------------------------------------------------------------------------- /www/nestedexample/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "buildbot-nestedexample", 3 | "engines": { 4 | "node": ">=0.10.0", 5 | "npm": ">=1.4.0" 6 | }, 7 | "dependencies": { 8 | "guanlecoja": "~1.1.0", 9 | "gulp": "3.9.0" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /www/nestedexample/setup.cfg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/www/nestedexample/setup.cfg -------------------------------------------------------------------------------- /www/nestedexample/src/styles/styles.less: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/www/nestedexample/src/styles/styles.less -------------------------------------------------------------------------------- /www/utils/run-ng-classify.js: -------------------------------------------------------------------------------- 1 | const ngClassify = require('ng-classify') 2 | const fs = require('fs') 3 | const util = require('util'); 4 | 5 | const readFile = util.promisify(fs.readFile) 6 | const writeFile = util.promisify(fs.writeFile) 7 | 8 | async function processNgClassify(args) { 9 | for (var i in args) { 10 | var path = args[i]; 11 | console.log(path); 12 | data = await readFile(path, 'utf8'); 13 | 14 | data = ngClassify(data); 15 | 16 | await writeFile(path, data); 17 | } 18 | } 19 | 20 | var args = process.argv.slice(2); 21 | processNgClassify(args); 22 | -------------------------------------------------------------------------------- /www/waterfall_view/buildbot_waterfall_view/__init__.py: -------------------------------------------------------------------------------- 1 | # This file is part of Buildbot. Buildbot is free software: you can 2 | # redistribute it and/or modify it under the terms of the GNU General Public 3 | # License as published by the Free Software Foundation, version 2. 4 | # 5 | # This program is distributed in the hope that it will be useful, but WITHOUT 6 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 7 | # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 8 | # details. 9 | # 10 | # You should have received a copy of the GNU General Public License along with 11 | # this program; if not, write to the Free Software Foundation, Inc., 51 12 | # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 13 | # 14 | # Copyright Buildbot Team Members 15 | 16 | from buildbot.www.plugin import Application 17 | 18 | # create the interface for the setuptools entry point 19 | ep = Application(__name__, "Buildbot Waterfall View UI") 20 | -------------------------------------------------------------------------------- /www/waterfall_view/karma.conf.js: -------------------------------------------------------------------------------- 1 | const common = require('buildbot-build-common'); 2 | 3 | module.exports = function karmaConfig (config) { 4 | common.createTemplateKarmaConfig(config, { 5 | testRoot: 'src/tests.webpack.js', 6 | webpack: require('./webpack.config') 7 | }); 8 | }; 9 | -------------------------------------------------------------------------------- /www/waterfall_view/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | autoprefixer: { 4 | browsers: ['last 2 versions'] 5 | }, 6 | }, 7 | }; 8 | -------------------------------------------------------------------------------- /www/waterfall_view/setup.cfg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/www/waterfall_view/setup.cfg -------------------------------------------------------------------------------- /www/waterfall_view/src/module/modal/modal.controller.js: -------------------------------------------------------------------------------- 1 | /* 2 | * decaffeinate suggestions: 3 | * DS102: Remove unnecessary code created because of implicit returns 4 | * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md 5 | */ 6 | class WaterfallModal { 7 | constructor($scope, $uibModalInstance, selectedBuild) { 8 | this.$uibModalInstance = $uibModalInstance; 9 | this.selectedBuild = selectedBuild; 10 | $scope.$on('$stateChangeStart', () => { 11 | return this.close(); 12 | }); 13 | } 14 | 15 | close() { 16 | return this.$uibModalInstance.close(); 17 | } 18 | } 19 | 20 | angular.module('waterfall_view') 21 | .controller('waterfallModalController', ['$scope', '$uibModalInstance', 'selectedBuild', WaterfallModal]); 22 | -------------------------------------------------------------------------------- /www/waterfall_view/src/module/modal/modal.style.less: -------------------------------------------------------------------------------- 1 | .modal-small { 2 | .modal-dialog { 3 | width: 80%; 4 | } 5 | 6 | .fa { 7 | cursor: pointer; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /www/waterfall_view/src/module/modal/modal.tpl.jade: -------------------------------------------------------------------------------- 1 | // Show build summary for the selected build in a modal window 2 | .modal-header 3 | i.fa.fa-times.pull-right(ng-click='modal.close()') 4 | h4.modal-title Build summary 5 | .modal-body 6 | buildsummary(ng-if='modal.selectedBuild' buildid='modal.selectedBuild.buildid') -------------------------------------------------------------------------------- /www/waterfall_view/src/module/waterfall.route.spec.js: -------------------------------------------------------------------------------- 1 | describe('Waterfall view', function() { 2 | let $state = null; 3 | 4 | const injected = $injector => $state = $injector.get('$state'); 5 | 6 | beforeEach(inject(injected)); 7 | 8 | it('should register a new state with the correct configuration', function() { 9 | const name = 'waterfall'; 10 | const states = $state.get().map(state => state.name); 11 | expect(states).toContain(name); 12 | }); 13 | }); 14 | -------------------------------------------------------------------------------- /www/waterfall_view/src/module/waterfall.tpl.jade: -------------------------------------------------------------------------------- 1 | .waterfall 2 | .load-indicator(ng-show='w.loading') 3 | .spinner 4 | i.fa.fa-circle-o-notch.fa-spin.fa-2x 5 | p loading 6 | p Tags: 7 | span(ng-show="w.all_tags.length > 0" ng-repeat="tag in w.all_tags") 8 | span.builder-tag.label.clickable.label-default(ng-click="w.toggleTag(tag)" ng-class="w.isTagFiltered(tag) ? 'label-success': 'label-default'") 9 | | {{ tag }} 10 | |   11 | span.label.clickable.label-danger(ng-click="w.clearTags()") x 12 | .header 13 | .header-content 14 | .content 15 | .inner-content 16 | .svg-container 17 | -------------------------------------------------------------------------------- /www/waterfall_view/src/tests.webpack.js: -------------------------------------------------------------------------------- 1 | // This file is an entry point for angular tests 2 | // Avoids some weird issues when using webpack + angular. 3 | 4 | import 'angular'; 5 | import 'angular-mocks/angular-mocks'; 6 | import './module/main.module.js' 7 | import '../test/d3/d3.service.js' 8 | 9 | const context = require.context('./', true, /\.spec.js$/); 10 | context.keys().forEach(context); 11 | -------------------------------------------------------------------------------- /www/waterfall_view/test/d3/d3.service.js: -------------------------------------------------------------------------------- 1 | // fake d3service for tests. 2 | // d3Service is supposed to be provided by the main www/base app 3 | // and is loading d3 asynchronously on demand 4 | 5 | import * as d3 from 'd3'; 6 | 7 | class D3 { 8 | constructor($q) { 9 | const d = $q.defer(); 10 | 11 | // Resolve function 12 | d.resolve(d3); 13 | 14 | return {get() { return d.promise; }}; 15 | } 16 | } 17 | 18 | angular.module('bbData') 19 | .service('d3Service', ['$q', D3]); 20 | -------------------------------------------------------------------------------- /www/waterfall_view/test/main.js: -------------------------------------------------------------------------------- 1 | // Mocked module dependency 2 | angular.module('ngAnimate', []); 3 | -------------------------------------------------------------------------------- /www/waterfall_view/webpack.config.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const common = require('buildbot-build-common'); 4 | const env = require('yargs').argv.env; 5 | const pkg = require('./package.json'); 6 | 7 | var event = process.env.npm_lifecycle_event; 8 | 9 | var isTest = event === 'test' || event === 'test-watch'; 10 | var isProd = env === 'prod'; 11 | 12 | module.exports = function() { 13 | return common.createTemplateWebpackConfig({ 14 | entry: { 15 | scripts: './src/module/main.module.js', 16 | styles: './src/styles/styles.less', 17 | }, 18 | libraryName: pkg.name, 19 | pluginName: pkg.plugin_name, 20 | dirname: __dirname, 21 | isTest: isTest, 22 | isProd: isProd, 23 | outputPath: __dirname + '/buildbot_waterfall_view/static', 24 | extractStyles: true, 25 | provideJquery: true, 26 | }); 27 | }(); 28 | -------------------------------------------------------------------------------- /www/wsgi_dashboards/karma.conf.js: -------------------------------------------------------------------------------- 1 | const common = require('buildbot-build-common'); 2 | 3 | module.exports = function karmaConfig (config) { 4 | common.createTemplateKarmaConfig(config, { 5 | testRoot: 'src/tests.webpack.js', 6 | webpack: require('./webpack.config') 7 | }); 8 | }; 9 | -------------------------------------------------------------------------------- /www/wsgi_dashboards/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "buildbot-wsgi-dashboards", 3 | "plugin_name": "wsgi_dashboards", 4 | "private": true, 5 | "main": "buildbot_wsgi_dashboards/static/scripts.js", 6 | "scripts": { 7 | "build": "rimraf buildbot_wsgi_dashboards/static && webpack --bail --progress --profile --env prod", 8 | "build-dev": "rimraf buildbot_wsgi_dashboards/static && webpack --bail --progress --profile --env dev", 9 | "dev": "webpack --bail --progress --profile --watch --env dev", 10 | "test": "karma start", 11 | "test-watch": "karma start --auto-watch --no-single-run" 12 | }, 13 | "devDependencies": { 14 | "angular-mocks": "^1.7.9", 15 | "buildbot-build-common": "link:../build_common", 16 | "rimraf": "^2.6.3" 17 | }, 18 | "dependencies": { 19 | "angular": "^1.8.0" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /www/wsgi_dashboards/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | autoprefixer: { 4 | browsers: ['last 2 versions'] 5 | }, 6 | }, 7 | }; 8 | -------------------------------------------------------------------------------- /www/wsgi_dashboards/setup.cfg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/www/wsgi_dashboards/setup.cfg -------------------------------------------------------------------------------- /www/wsgi_dashboards/src/module/main.module.js: -------------------------------------------------------------------------------- 1 | 2 | angular.module('wsgi_dashboards', [ 3 | 'ui.router', 4 | 'buildbot_config', 5 | 'guanlecoja.ui' 6 | ]); 7 | 8 | require('./dashboards.route.js'); 9 | -------------------------------------------------------------------------------- /www/wsgi_dashboards/src/module/main.module.spec.js: -------------------------------------------------------------------------------- 1 | describe('WSGIDashboards', () => it('should have one test', function() {})); 2 | -------------------------------------------------------------------------------- /www/wsgi_dashboards/src/styles/styles.less: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flathub-infra/buildbot/9d8e2b5483b2e446389548446ebf9c3934380682/www/wsgi_dashboards/src/styles/styles.less -------------------------------------------------------------------------------- /www/wsgi_dashboards/src/tests.webpack.js: -------------------------------------------------------------------------------- 1 | // This file is an entry point for angular tests 2 | // Avoids some weird issues when using webpack + angular. 3 | 4 | import 'angular'; 5 | import 'angular-mocks/angular-mocks'; 6 | import './module/main.module.js' 7 | 8 | const context = require.context('./', true, /\.spec.js$/); 9 | context.keys().forEach(context); 10 | -------------------------------------------------------------------------------- /www/wsgi_dashboards/webpack.config.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const common = require('buildbot-build-common'); 4 | const env = require('yargs').argv.env; 5 | const pkg = require('./package.json'); 6 | 7 | var event = process.env.npm_lifecycle_event; 8 | 9 | var isTest = event === 'test' || event === 'test-watch'; 10 | var isProd = env === 'prod'; 11 | 12 | module.exports = function() { 13 | return common.createTemplateWebpackConfig({ 14 | entry: { 15 | scripts: './src/module/main.module.js', 16 | }, 17 | libraryName: pkg.name, 18 | pluginName: pkg.plugin_name, 19 | dirname: __dirname, 20 | isTest: isTest, 21 | isProd: isProd, 22 | outputPath: __dirname + '/buildbot_wsgi_dashboards/static', 23 | }); 24 | }(); 25 | --------------------------------------------------------------------------------