squad 1.91__tar.gz → 1.93__tar.gz
Sign up to get free protection for your applications and to get access to all the features.
- {squad-1.91 → squad-1.93}/CHANGELOG.md +8 -0
- {squad-1.91/squad.egg-info → squad-1.93}/PKG-INFO +1 -1
- {squad-1.91 → squad-1.93}/squad/api/prometheus.py +1 -1
- {squad-1.91 → squad-1.93}/squad/ci/backend/tuxsuite.py +10 -16
- squad-1.93/squad/core/management/commands/run_log_parser.py +44 -0
- {squad-1.91 → squad-1.93}/squad/core/models.py +9 -4
- {squad-1.91 → squad-1.93}/squad/plugins/lib/base_log_parser.py +101 -40
- squad-1.93/squad/plugins/linux_log_parser.py +72 -0
- squad-1.93/squad/plugins/linux_log_parser_build.py +332 -0
- squad-1.93/squad/version.py +1 -0
- {squad-1.91 → squad-1.93/squad.egg-info}/PKG-INFO +1 -1
- {squad-1.91 → squad-1.93}/squad.egg-info/SOURCES.txt +21 -0
- {squad-1.91 → squad-1.93}/test/ci/backend/test_tuxsuite.py +7 -46
- squad-1.93/test/plugins/linux_log_parser_build/clang_arm64_25103120.log +585 -0
- squad-1.93/test/plugins/linux_log_parser_build/clang_arm_24958120.log +228 -0
- squad-1.93/test/plugins/linux_log_parser_build/clang_arm_26001178.log +3056 -0
- squad-1.93/test/plugins/linux_log_parser_build/clang_i386_25043392.log +37 -0
- squad-1.93/test/plugins/linux_log_parser_build/clang_i386_25431539.log +4677 -0
- squad-1.93/test/plugins/linux_log_parser_build/clang_riscv_24688299.log +43 -0
- squad-1.93/test/plugins/linux_log_parser_build/clang_x86_64_25086964.log +37 -0
- squad-1.93/test/plugins/linux_log_parser_build/clang_x86_64_26103794.log +1904 -0
- squad-1.93/test/plugins/linux_log_parser_build/gcc_arm64_24934206.log +4642 -0
- squad-1.93/test/plugins/linux_log_parser_build/gcc_arm_24951924.log +255 -0
- squad-1.93/test/plugins/linux_log_parser_build/gcc_arm_25044425.log +1213 -0
- squad-1.93/test/plugins/linux_log_parser_build/gcc_arm_25078650.log +116 -0
- squad-1.93/test/plugins/linux_log_parser_build/gcc_i386_25044475.log +4124 -0
- squad-1.93/test/plugins/linux_log_parser_build/gcc_riscv_24715191.log +43 -0
- squad-1.93/test/plugins/linux_log_parser_build/gcc_s390_26103313.log +27 -0
- squad-1.93/test/plugins/linux_log_parser_build/gcc_sh_26103296.log +26 -0
- squad-1.93/test/plugins/linux_log_parser_build/gcc_x86_64_24932905.log +3835 -0
- squad-1.93/test/plugins/linux_log_parser_build/gcc_x86_64_26103833.log +2243 -0
- {squad-1.91 → squad-1.93}/test/plugins/test_linux_log_parser.py +12 -0
- squad-1.93/test/plugins/test_linux_log_parser_build.py +1259 -0
- {squad-1.91 → squad-1.93}/test/plugins/test_log_parser_base.py +25 -2
- {squad-1.91 → squad-1.93}/test/plugins/test_plugin.py +4 -0
- squad-1.91/squad/plugins/linux_log_parser.py +0 -71
- squad-1.91/squad/version.py +0 -1
- {squad-1.91 → squad-1.93}/.ackrc +0 -0
- {squad-1.91 → squad-1.93}/.coveragerc +0 -0
- {squad-1.91 → squad-1.93}/.ctags +0 -0
- {squad-1.91 → squad-1.93}/.dockerignore +0 -0
- {squad-1.91 → squad-1.93}/.gitignore +0 -0
- {squad-1.91 → squad-1.93}/.mailmap +0 -0
- {squad-1.91 → squad-1.93}/.readthedocs.yml +0 -0
- {squad-1.91 → squad-1.93}/.reuse/dep5 +0 -0
- {squad-1.91 → squad-1.93}/COPYING +0 -0
- {squad-1.91 → squad-1.93}/COPYRIGHTS +0 -0
- {squad-1.91 → squad-1.93}/Dockerfile +0 -0
- {squad-1.91 → squad-1.93}/LICENSES/GPL-3.0-or-later.txt +0 -0
- {squad-1.91 → squad-1.93}/LICENSES/MIT.txt +0 -0
- {squad-1.91 → squad-1.93}/LICENSES/OFL-1.1.txt +0 -0
- {squad-1.91 → squad-1.93}/MANIFEST.in +0 -0
- {squad-1.91 → squad-1.93}/Procfile +0 -0
- {squad-1.91 → squad-1.93}/README.rst +0 -0
- {squad-1.91 → squad-1.93}/babel.cfg +0 -0
- {squad-1.91 → squad-1.93}/dev-docker +0 -0
- {squad-1.91 → squad-1.93}/doc/.gitignore +0 -0
- {squad-1.91 → squad-1.93}/doc/Makefile +0 -0
- {squad-1.91 → squad-1.93}/doc/api.rst +0 -0
- {squad-1.91 → squad-1.93}/doc/ci.rst +0 -0
- {squad-1.91 → squad-1.93}/doc/conf.py +0 -0
- {squad-1.91 → squad-1.93}/doc/hacking.rst +0 -0
- {squad-1.91 → squad-1.93}/doc/index.rst +0 -0
- {squad-1.91 → squad-1.93}/doc/install.rst +0 -0
- {squad-1.91 → squad-1.93}/doc/intro.rst +0 -0
- {squad-1.91 → squad-1.93}/doc/lava_usecase.rst +0 -0
- {squad-1.91 → squad-1.93}/doc/plugins.rst +0 -0
- {squad-1.91 → squad-1.93}/doc/quickstart.rst +0 -0
- {squad-1.91 → squad-1.93}/doc/translating.rst +0 -0
- {squad-1.91 → squad-1.93}/doc/tuxsuite_usecase.rst +0 -0
- {squad-1.91 → squad-1.93}/docker/db-dumped +0 -0
- {squad-1.91 → squad-1.93}/docker/db-to-be-restored +0 -0
- {squad-1.91 → squad-1.93}/docker/docker-compose.yml +0 -0
- {squad-1.91 → squad-1.93}/docker/extra_settings.py +0 -0
- {squad-1.91 → squad-1.93}/docker/init-db.sh +0 -0
- {squad-1.91 → squad-1.93}/docker/rabbitmq.config +0 -0
- {squad-1.91 → squad-1.93}/docker/squad-apache.conf +0 -0
- {squad-1.91 → squad-1.93}/docker-compose.yaml +0 -0
- {squad-1.91 → squad-1.93}/manage.py +0 -0
- {squad-1.91 → squad-1.93}/package-lock.json +0 -0
- {squad-1.91 → squad-1.93}/package.json +0 -0
- {squad-1.91 → squad-1.93}/pytest.ini +0 -0
- {squad-1.91 → squad-1.93}/requirements-dev.txt +0 -0
- {squad-1.91 → squad-1.93}/requirements.txt +0 -0
- {squad-1.91 → squad-1.93}/scripts/build +0 -0
- {squad-1.91 → squad-1.93}/scripts/check-ci +0 -0
- {squad-1.91 → squad-1.93}/scripts/check-ignore +0 -0
- {squad-1.91 → squad-1.93}/scripts/community_connector/main.js +0 -0
- {squad-1.91 → squad-1.93}/scripts/community_connector/manifest.json +0 -0
- {squad-1.91 → squad-1.93}/scripts/dogfood +0 -0
- {squad-1.91 → squad-1.93}/scripts/get-metrics +0 -0
- {squad-1.91 → squad-1.93}/scripts/get-tests +0 -0
- {squad-1.91 → squad-1.93}/scripts/git-build +0 -0
- {squad-1.91 → squad-1.93}/scripts/pytest +0 -0
- {squad-1.91 → squad-1.93}/scripts/rabbitmq-server +0 -0
- {squad-1.91 → squad-1.93}/scripts/release +0 -0
- {squad-1.91 → squad-1.93}/scripts/release-docker +0 -0
- {squad-1.91 → squad-1.93}/scripts/squad-config +0 -0
- {squad-1.91 → squad-1.93}/scripts/test-ci +0 -0
- {squad-1.91 → squad-1.93}/scripts/test-docker +0 -0
- {squad-1.91 → squad-1.93}/scripts/testdata/gen-ci-jobs +0 -0
- {squad-1.91 → squad-1.93}/scripts/testdata/gen-metrics +0 -0
- {squad-1.91 → squad-1.93}/scripts/testdata/gen-test-data +0 -0
- {squad-1.91 → squad-1.93}/scripts/testdata/gen-tests +0 -0
- {squad-1.91 → squad-1.93}/scripts/testdata/setup-dev +0 -0
- {squad-1.91 → squad-1.93}/scripts/testdata/submit-ci-jobs +0 -0
- {squad-1.91 → squad-1.93}/scripts/testdata/submit-test-data +0 -0
- {squad-1.91 → squad-1.93}/scripts/translate +0 -0
- {squad-1.91 → squad-1.93}/scripts/travis-lava +0 -0
- {squad-1.91 → squad-1.93}/scripts/update-translation-files +0 -0
- {squad-1.91 → squad-1.93}/setup.cfg +0 -0
- {squad-1.91 → squad-1.93}/setup.py +0 -0
- {squad-1.91 → squad-1.93}/squad/__init__.py +0 -0
- {squad-1.91 → squad-1.93}/squad/admin.py +0 -0
- {squad-1.91 → squad-1.93}/squad/api/__init__.py +0 -0
- {squad-1.91 → squad-1.93}/squad/api/apps.py +0 -0
- {squad-1.91 → squad-1.93}/squad/api/ci.py +0 -0
- {squad-1.91 → squad-1.93}/squad/api/data.py +0 -0
- {squad-1.91 → squad-1.93}/squad/api/filters.py +0 -0
- {squad-1.91 → squad-1.93}/squad/api/rest.py +0 -0
- {squad-1.91 → squad-1.93}/squad/api/urls.py +0 -0
- {squad-1.91 → squad-1.93}/squad/api/utils.py +0 -0
- {squad-1.91 → squad-1.93}/squad/api/views.py +0 -0
- {squad-1.91 → squad-1.93}/squad/celery.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/__init__.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/admin.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/apps.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/backend/__init__.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/backend/fake.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/backend/lava.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/backend/null.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/exceptions.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/management/__init__.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/management/commands/__init__.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/management/commands/create_tuxsuite_boot_tests.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/management/commands/listen.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/management/commands/testfetch.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/migrations/0001_initial.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/migrations/0002_auto_20170406_1252.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/migrations/0003_backend_name.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/migrations/0004_testjob_failure.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/migrations/0005_remove_listener_data.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/migrations/0006_simplify_backend_loading.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/migrations/0007_auto_20170517_1736.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/migrations/0008_testjob_testrun.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/migrations/0009_slug_pattern.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/migrations/0010_testjob_can_resubmit.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/migrations/0011_testjob_resubmitted_count.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/migrations/0012_testjob_build.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/migrations/0013_testjob_name.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/migrations/0014_testjob_target_build.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/migrations/0015_testjob_populate_target_build.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/migrations/0016_backend_max_fetch_attempts.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/migrations/0017_testjob_fetch_attempts.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/migrations/0018_testjob_dates.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/migrations/0019_add_fake_backend.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/migrations/0020_backend_settings_field.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/migrations/0021_testjob_parent_job.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/migrations/0022_backend_poll_enabled.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/migrations/0023_remove_testjob_build.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/migrations/0024_fix_testjob_environment_validation.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/migrations/0025_backend_listen_enabled.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/migrations/0026_job_start_end_time.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/migrations/0027_add_tuxsuite_implementation_type.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/migrations/0028_create_testjob_indexes.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/migrations/0029_create_testjob_results_input.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/migrations/0030_testjob_subtasks_count.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/migrations/__init__.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/models.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/tasks.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/templates/squad/ci/testjob_resubmit.html.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/templates/squad/ci/testjob_resubmit.txt.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/templatetags/__init__.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/templatetags/filter_jobs.py +0 -0
- {squad-1.91 → squad-1.93}/squad/ci/utils.py +0 -0
- {squad-1.91 → squad-1.93}/squad/compat.py +0 -0
- {squad-1.91 → squad-1.93}/squad/container_settings.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/__init__.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/admin.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/apps.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/callback.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/comparison.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/data.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/failures.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/history.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/locale/django.pot +0 -0
- {squad-1.91 → squad-1.93}/squad/core/locale/es_MX/LC_MESSAGES/django.po +0 -0
- {squad-1.91 → squad-1.93}/squad/core/locale/pl/LC_MESSAGES/django.po +0 -0
- {squad-1.91 → squad-1.93}/squad/core/locale/pt/LC_MESSAGES/django.po +0 -0
- {squad-1.91 → squad-1.93}/squad/core/locale/pt_BR/LC_MESSAGES/django.po +0 -0
- {squad-1.91 → squad-1.93}/squad/core/management/__init__.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/management/commands/__init__.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/management/commands/compute_build_summaries.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/management/commands/compute_project_statuses.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/management/commands/fill_test_metadata.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/management/commands/fix_squadplugin_data.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/management/commands/import_data.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/management/commands/import_data.rst +0 -0
- {squad-1.91 → squad-1.93}/squad/core/management/commands/migrate_test_runs.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/management/commands/populate_metric_build_and_environment.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/management/commands/populate_test_build_and_environment.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/management/commands/prepdump.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/management/commands/send-email.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/management/commands/update_project_statuses.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/management/commands/users.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0001_initial.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0002_auto_20160525_1403.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0003_testrun_log_file.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0004_group_user_groups.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0005_token.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0006_auto_20160826_2242.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0007_testrun_data_processed.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0008_status.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0009_testrun_status_recorded.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0010_testrun_datetime.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0011_testrun_metadata_fields.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0012_build_datetime.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0013_testrun_resubmit_url.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0014_testrun_metadata_file.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0015_attachment.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0016_project_is_public.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0017_slug_validator.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0018_build_name.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0019_build_version.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0020_build_ordering.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0021_global_tokens.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0022_projectstatus.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0023_subscription.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0024_project_build_completion_threshold.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0025_unique_testrun_job_id.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0026_testrun_result_accept_null.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0027_project_notification_strategy.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0028_suite_and_test_name_length.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0029_subscription_email_formats.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0030_remove_project_build_completion_threshold.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0031_environment_expected_test_runs.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0032_testrun_completed.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0033_drop_debversion.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0034_prepare_to_remove_build_name.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0035_remove_build_name.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0036_status_tests_skip.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0037_project_status_test_summary_fields.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0038_populate_project_status_cache.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0039_orderings.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0040_remove_subscription_html.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0041_projectstatus_notified.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0042_set_projectstatus_notified.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0043_project_status_build.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0044_project_html_mail.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0045_adminsubscription.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0046_projectstatus_last_updated.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0047_populate_projectstatus_last_updated.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0048_moderate_notifications.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0049_projectstatus_plural.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0050_projectstatus_finished.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0051_build_status.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0052_recreate_projectstatus_data.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0053_remove_projectstatus_previous.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0054_custom_email_template.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0055_emailtemplate_subject.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0056_project_description.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0057_projectstatus_has_metrics.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0058_populate_projectstatus_has_metrics.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0059_project_important_metadata_keys.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0060_test_log.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0061_project_enabled_plugins_list.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0062_project_allow_empty_enabled_plugin_list.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0063_project_wait_before_notification.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0064_project_notification_timeout.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0065_projectstatus_notified_on_timeout.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0066_environment_description.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0067_accept_blank_suite_name.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0068_suite_version.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0069_suite_metadata.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0070_create_suite_test_and_metric_metadata.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0071_migrate_old_tokens.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0072_group_description.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0073_auto_20180420_1643.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0074_add_indexes.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0075_update_project_enabled_plugin_list.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0076_patch_builds.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0077_knownissue.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0078_cache_test_run_counts.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0079_init_cache_test_run_counts.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0080_auto_20180810_0047.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0081_status_has_metrics.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0082_populate_status_has_metrics.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0083_rename_knownissue_environments.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0084_projectstatus_regressions_fixes.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0085_projectstatus_defaults.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0086_xfail.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0087_test_known_issues.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0088_user_subscriptions.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0089_test_has_known_issues.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0090_populate_test_has_known_issues.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0091_notification_delivery_remove_unique_status.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0092_annotation.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0093_historicalemailtemplate.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0094_populatehistoricalemailtemplate.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0095_project_data_retention_days.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0096_build_keep_data.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0097_build_placeholder.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0098_blank_annotation.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0099_metricthreshold.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0100_metric_is_outlier.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0101_project_project_settings.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0102_projectstatus_null_metric_summary.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0103_populate_project_status.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0104_delayedreport.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0105_delayed_report_error_message.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0106_delayedreport_output_subject.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0107_move_notification_strategy.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0108_add_email_template_validator.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0109_group_member.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0110_move_users_from_django_groups_to_squad_groups.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0111_remove_group_user_groups.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0112_user_namespaces.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0113_group_project_blank_name_and_description.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0114_project_enabled_plugin_list_can_be_blank.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0115_fix_slug_validation.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0116_make_group_membership_unique.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0117_drop_obsolete_token_model.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0118_project_is_archived.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0119_i18n.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0120_buildsummary.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0121_add_password_patchsource.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0122_fix_patchsource_url_and_token.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0123_django_upgrade_missing_migrations.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0124_set_default_expected_test_runs_to_zero.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0125_fix_missing_status_has_metrics_for_testruns.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0126_metricthreshold_environment.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0127_metric_thresholds_migrate_data.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0128_metric_thresholds_remove_proj_col.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0129_projectstatus_nullable_notified_on_timeout.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0130_project_status_baseline_next.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0131_create_squad_auth_group_and_add_users.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0132_attachment_mimetype.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0133_append_project_permissions_to_squad_auth_group.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0134_longer_metric_name.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0135_add_privileged_access_level.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0136_migrate_submitters_to_privileged.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0137_patchsource_token_null.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0138_metric_unit.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0139_nullable_test_name.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0140_increase_gerrit_password_length.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0141_remove_test_name.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0142_add_testrun_file_storage.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0143_attachment_storage.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0144_attachment_data_null.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0145_pluginscratch.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0146_deprecate_testrun_and_attachment_data_fields.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0147_add_build_and_environment_to_test.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0148_remove_legacy_storage_fields.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0149_build_patch_url.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0150_add_new_notification_strategy.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0151_callback.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0152_add_build_patch_notified.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0153_callback_make_response_content_blob.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0154_project_add_force_finishing_builds_field.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0155_add_build_and_environment_to_metric.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0156_nullable_metric_name.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0157_remove_metric_name.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0158_add_metric_comparison_to_projectstatus.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0159_nullable_metricthreshold_value.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0160_add_project_to_metricthreshold.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0161_add_metricthreshold_perm_to_squad_group.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0162_project_add_build_confidence_settings.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0163_hirtoricalemailtemplate_update.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0164_django_update.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0165_buildsummary_uniqueness.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0166_build_is_release.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0167_add_project_datetime.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0168_add_group_settings.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/0169_userpreferences.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/migrations/__init__.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/notification.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/plugins.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/queries.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/statistics.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/tasks/__init__.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/tasks/exceptions.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/tasks/notification.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/templates/squad/notification/base.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/core/templates/squad/notification/diff.html.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/core/templates/squad/notification/diff.txt.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/core/templates/squad/notification/failed_test_jobs.html.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/core/templates/squad/notification/failed_test_jobs.txt.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/core/templates/squad/notification/moderation.html.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/core/templates/squad/notification/moderation.txt.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/core/templatetags/__init__.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/templatetags/squad_notification.py +0 -0
- {squad-1.91 → squad-1.93}/squad/core/utils.py +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/__init__.py +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/__main__.py +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/admin.py +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/apps.py +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/badges.py +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/build_settings.py +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/ci.py +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/comparison.py +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/extract.py +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/forms.py +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/group_settings.py +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/locale/django.pot +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/locale/pl/LC_MESSAGES/django.po +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/locale/pt/LC_MESSAGES/django.po +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/locale/pt_BR/LC_MESSAGES/django.po +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/management/__init__.py +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/management/commands/__init__.py +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/management/commands/get_token.py +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/metrics.py +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/project_settings.py +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/queries.py +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/setup.py +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/static/compare.css +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/static/download +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/static/download.conf +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/static/favicon.ico +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/static/main.css +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/static/squad/attach_select2.js +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/static/squad/build.js +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/static/squad/build_compare.js +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/static/squad/build_list.js +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/static/squad/charts.js +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/static/squad/common.js +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/static/squad/compare.js +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/static/squad/config.js +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/static/squad/controllers/annotation.js +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/static/squad/controllers/build_compare.js +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/static/squad/controllers/build_list_compare.js +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/static/squad/controllers/build_release.js +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/static/squad/controllers/cancel.js +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/static/squad/controllers/charts.js +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/static/squad/controllers/compare.js +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/static/squad/controllers/fetch.js +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/static/squad/controllers/filter.js +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/static/squad/controllers/metricThreshold.js +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/static/squad/controllers/project_compare.js +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/static/squad/controllers/resubmit.js +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/static/squad/controllers/testjobs_progress.js +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/static/squad/metric.threshold.js +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/static/squad/project_compare.js +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/static/squad/showHide.js +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/static/squad/table.js +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/static/squad_sign.svg +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/401.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/404.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/django/rest_framework/api.html +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/django/squad/_user_menu.html +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/_builds_table.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/_env_suite_data.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/_metadata.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/_pagination.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/_permissions.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/_project_list.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/_regressions_and_fixes.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/_results_table.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/_results_transitions_filter.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/_subscribe.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/_test_results_envbox.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/_test_results_suitebox.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/_test_results_summary.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/_test_results_table.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/_test_run_metric.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/_test_run_test.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/_unfinished_build.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/_user_menu.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/base.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/build-nav.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/build.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/build_callbacks.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/build_metadata.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/build_metrics.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/build_settings.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/builds.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/compare.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/compare_builds.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/compare_projects.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/group-nav.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/group.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/group_settings/advanced.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/group_settings/base.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/group_settings/delete.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/group_settings/index.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/group_settings/members.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/group_settings/new_group.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/group_settings/new_project.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/index.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/knownissues.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/login.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/metrics.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/project-nav.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/project.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/project_settings/_threshold_table.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/project_settings/advanced.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/project_settings/base.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/project_settings/build_confidence.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/project_settings/delete.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/project_settings/environments.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/project_settings/index.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/project_settings/thresholds.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/test_history.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/test_run.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/test_run_suite_metrics.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/test_run_suite_test_details.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/test_run_suite_tests.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/testjob.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/testjobs.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/testjobs_progress.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/tests-details-nav.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/tests.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/user_settings/api_token.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/user_settings/base.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/user_settings/profile.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/user_settings/projects.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/user_settings/subscriptions.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templates/squad/user_settings/user_preferences.jinja2 +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templatetags/__init__.py +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/templatetags/squad.py +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/tests.py +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/urls.py +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/user_settings.py +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/utils.py +0 -0
- {squad-1.91 → squad-1.93}/squad/frontend/views.py +0 -0
- {squad-1.91 → squad-1.93}/squad/http.py +0 -0
- {squad-1.91 → squad-1.93}/squad/jinja2.py +0 -0
- {squad-1.91 → squad-1.93}/squad/mail.py +0 -0
- {squad-1.91 → squad-1.93}/squad/manage.py +0 -0
- {squad-1.91 → squad-1.93}/squad/plugins/__init__.py +0 -0
- {squad-1.91 → squad-1.93}/squad/plugins/example.py +0 -0
- {squad-1.91 → squad-1.93}/squad/plugins/gerrit.py +0 -0
- {squad-1.91 → squad-1.93}/squad/plugins/github.py +0 -0
- {squad-1.91 → squad-1.93}/squad/plugins/lib/__init__.py +0 -0
- {squad-1.91 → squad-1.93}/squad/run/__init__.py +0 -0
- {squad-1.91 → squad-1.93}/squad/run/__main__.py +0 -0
- {squad-1.91 → squad-1.93}/squad/run/listener.py +0 -0
- {squad-1.91 → squad-1.93}/squad/run/scheduler.py +0 -0
- {squad-1.91 → squad-1.93}/squad/run/worker.py +0 -0
- {squad-1.91 → squad-1.93}/squad/settings.py +0 -0
- {squad-1.91 → squad-1.93}/squad/socialaccount.py +0 -0
- {squad-1.91 → squad-1.93}/squad/urls.py +0 -0
- {squad-1.91 → squad-1.93}/squad/wsgi.py +0 -0
- {squad-1.91 → squad-1.93}/squad.egg-info/dependency_links.txt +0 -0
- {squad-1.91 → squad-1.93}/squad.egg-info/entry_points.txt +0 -0
- {squad-1.91 → squad-1.93}/squad.egg-info/requires.txt +0 -0
- {squad-1.91 → squad-1.93}/squad.egg-info/top_level.txt +0 -0
- {squad-1.91 → squad-1.93}/squad.svg +0 -0
- {squad-1.91 → squad-1.93}/test/__init__.py +0 -0
- {squad-1.91 → squad-1.93}/test/api/__init__.py +0 -0
- {squad-1.91 → squad-1.93}/test/api/benchmarks.csv +0 -0
- {squad-1.91 → squad-1.93}/test/api/benchmarks.json +0 -0
- {squad-1.91 → squad-1.93}/test/api/definition.yaml +0 -0
- {squad-1.91 → squad-1.93}/test/api/metadata.json +0 -0
- {squad-1.91 → squad-1.93}/test/api/test_ci.py +0 -0
- {squad-1.91 → squad-1.93}/test/api/test_data.py +0 -0
- {squad-1.91 → squad-1.93}/test/api/test_rest.py +0 -0
- {squad-1.91 → squad-1.93}/test/api/test_run.log +0 -0
- {squad-1.91 → squad-1.93}/test/api/tests.csv +0 -0
- {squad-1.91 → squad-1.93}/test/api/tests.json +0 -0
- {squad-1.91 → squad-1.93}/test/api/tests.py +0 -0
- {squad-1.91 → squad-1.93}/test/api/tests_log.json +0 -0
- {squad-1.91 → squad-1.93}/test/api/tests_two.json +0 -0
- {squad-1.91 → squad-1.93}/test/api/twoline_definition.yaml +0 -0
- {squad-1.91 → squad-1.93}/test/ci/__init__.py +0 -0
- {squad-1.91 → squad-1.93}/test/ci/backend/__init__.py +0 -0
- {squad-1.91 → squad-1.93}/test/ci/backend/example-broken-log.yaml +0 -0
- {squad-1.91 → squad-1.93}/test/ci/backend/example-lava-log.yaml +0 -0
- {squad-1.91 → squad-1.93}/test/ci/backend/lava.json +0 -0
- {squad-1.91 → squad-1.93}/test/ci/backend/test_fake.py +0 -0
- {squad-1.91 → squad-1.93}/test/ci/backend/test_lava.py +0 -0
- {squad-1.91 → squad-1.93}/test/ci/backend/test_real_lava.py +0 -0
- {squad-1.91 → squad-1.93}/test/ci/backend/tuxsuite_test_failed_result_sample.json +0 -0
- {squad-1.91 → squad-1.93}/test/ci/backend/tuxsuite_test_result_sample.json +0 -0
- {squad-1.91 → squad-1.93}/test/ci/test_listen.py +0 -0
- {squad-1.91 → squad-1.93}/test/ci/test_models.py +0 -0
- {squad-1.91 → squad-1.93}/test/ci/test_tasks.py +0 -0
- {squad-1.91 → squad-1.93}/test/core/__init__.py +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_attachment.py +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_build.py +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_build_summary.py +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_callback.py +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_emailtemplate.py +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_failures.py +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_group.py +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_historical_emailtemplate.py +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_history.py +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_import_data.py +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_import_data_input/1/default/1/metadata.json +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_import_data_input/1/default/1/metrics.json +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_import_data_input/2/default/2/metadata.json +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_import_data_input/2/default/2/metrics.json +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_import_data_input/2/default/2/screenshot.png +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_import_data_input/2/default/2/tests.json +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_import_data_missing_metadata/1/1/tests.json +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_known_issues.py +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_metric.py +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_metric_comparison.py +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_metric_threshold.py +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_metrics_data.py +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_metrics_summary.py +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_notification.py +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_notification_delivery.py +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_patch_source.py +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_project.py +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_project_status.py +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_statistics.py +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_tasks.py +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_tasks_notification.py +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_test.py +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_test_comparison.py +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_test_data.py +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_test_run.py +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_test_summary.py +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_update_project_statuses.py +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_user_namespace.py +0 -0
- {squad-1.91 → squad-1.93}/test/core/test_utils.py +0 -0
- {squad-1.91 → squad-1.93}/test/frontend/__init__.py +0 -0
- {squad-1.91 → squad-1.93}/test/frontend/test_basics.py +0 -0
- {squad-1.91 → squad-1.93}/test/frontend/test_comparison.py +0 -0
- {squad-1.91 → squad-1.93}/test/frontend/test_get_token_command.py +0 -0
- {squad-1.91 → squad-1.93}/test/frontend/test_group_settings.py +0 -0
- {squad-1.91 → squad-1.93}/test/frontend/test_history.py +0 -0
- {squad-1.91 → squad-1.93}/test/frontend/test_template_tags.py +0 -0
- {squad-1.91 → squad-1.93}/test/frontend/test_test_job.py +0 -0
- {squad-1.91 → squad-1.93}/test/frontend/test_tests.py +0 -0
- {squad-1.91 → squad-1.93}/test/frontend/test_utils.py +0 -0
- {squad-1.91 → squad-1.93}/test/integration/__init__.py +0 -0
- {squad-1.91 → squad-1.93}/test/integration/plugins/test_tradefed.py +0 -0
- {squad-1.91 → squad-1.93}/test/integration/plugins/tradefed-output-20220608105250.tar.xz +0 -0
- {squad-1.91 → squad-1.93}/test/integration/test_build_notification_from_ci.py +0 -0
- {squad-1.91 → squad-1.93}/test/javascript.py +0 -0
- {squad-1.91 → squad-1.93}/test/karma.conf.js +0 -0
- {squad-1.91 → squad-1.93}/test/mock.py +0 -0
- {squad-1.91 → squad-1.93}/test/performance.py +0 -0
- {squad-1.91 → squad-1.93}/test/plugins/__init__.py +0 -0
- {squad-1.91 → squad-1.93}/test/plugins/linux_log_parser/internal-error-oops.log +0 -0
- {squad-1.91 → squad-1.93}/test/plugins/linux_log_parser/kasan.log +0 -0
- {squad-1.91 → squad-1.93}/test/plugins/linux_log_parser/kcsan_full_log.log +0 -0
- {squad-1.91 → squad-1.93}/test/plugins/linux_log_parser/kcsan_simple.log +0 -0
- {squad-1.91 → squad-1.93}/test/plugins/linux_log_parser/kernel_bug_and_invalid_opcode.log +0 -0
- {squad-1.91 → squad-1.93}/test/plugins/linux_log_parser/kernelexceptiontrace.log +0 -0
- {squad-1.91 → squad-1.93}/test/plugins/linux_log_parser/kernelexceptiontrace_without_squarebraces.log +0 -0
- {squad-1.91 → squad-1.93}/test/plugins/linux_log_parser/kernelpanic-multiline.log +0 -0
- {squad-1.91 → squad-1.93}/test/plugins/linux_log_parser/kernelpanic-single-and-multiline.log +0 -0
- {squad-1.91 → squad-1.93}/test/plugins/linux_log_parser/kfence.log +0 -0
- {squad-1.91 → squad-1.93}/test/plugins/linux_log_parser/multiple_issues_dmesg.log +0 -0
- {squad-1.91 → squad-1.93}/test/plugins/linux_log_parser/oops.log +0 -0
- {squad-1.91 → squad-1.93}/test/plugins/linux_log_parser/rcu_warning.log +0 -0
- {squad-1.91 → squad-1.93}/test/plugins/test_gerrit.py +0 -0
- {squad-1.91 → squad-1.93}/test/plugins/test_github.py +0 -0
- {squad-1.91 → squad-1.93}/test/settings.py +0 -0
- {squad-1.91 → squad-1.93}/test/test_architecture.py +0 -0
- {squad-1.91 → squad-1.93}/test/test_code_quality.py +0 -0
- {squad-1.91 → squad-1.93}/test/test_cors.py +0 -0
- {squad-1.91 → squad-1.93}/test/test_i18n.py +0 -0
- {squad-1.91 → squad-1.93}/test/test_mail.py +0 -0
- {squad-1.91 → squad-1.93}/test/test_pending_migrations.py +0 -0
- {squad-1.91 → squad-1.93}/test/unit/test_annotation.js +0 -0
- {squad-1.91 → squad-1.93}/test/unit/test_cancel.js +0 -0
- {squad-1.91 → squad-1.93}/test/unit/test_charts.js +0 -0
- {squad-1.91 → squad-1.93}/test/unit/test_compare.js +0 -0
- {squad-1.91 → squad-1.93}/test/unit/test_filter.js +0 -0
- {squad-1.91 → squad-1.93}/test/unit/test_resubmit.js +0 -0
@@ -1,3 +1,11 @@
|
|
1
|
+
# 1.93
|
2
|
+
|
3
|
+
This 1.93 release adds support for a build log parser as well as some other minor bug fixes and improvements.
|
4
|
+
|
5
|
+
# 1.92
|
6
|
+
|
7
|
+
This 1.92 release avoids an extra retry when fetching errored builds/tests in Tuxsuite.
|
8
|
+
|
1
9
|
# 1.91
|
2
10
|
|
3
11
|
This 1.91 release brings a few changes worth pointing out separately:
|
@@ -43,7 +43,7 @@ def metrics(request):
|
|
43
43
|
|
44
44
|
for queue in queues:
|
45
45
|
if queue['name'] in available_queues:
|
46
|
-
metric_name = f'queue_{queue["name"]}
|
46
|
+
metric_name = f'queue_{queue["name"]}_count'
|
47
47
|
length = queue['messages_ready']
|
48
48
|
|
49
49
|
output += f'\n# TYPE {metric_name} counter'
|
@@ -10,6 +10,7 @@ from requests.adapters import HTTPAdapter, Retry
|
|
10
10
|
from functools import reduce
|
11
11
|
from urllib.parse import urljoin
|
12
12
|
|
13
|
+
from cryptography.exceptions import InvalidSignature
|
13
14
|
from cryptography.hazmat.primitives.asymmetric import ec
|
14
15
|
from cryptography.hazmat.primitives import (
|
15
16
|
hashes,
|
@@ -249,9 +250,6 @@ class Backend(BaseBackend):
|
|
249
250
|
test_job.name = test_name
|
250
251
|
|
251
252
|
build_status = results['build_status']
|
252
|
-
if build_status == 'error' and results['retry'] < 2:
|
253
|
-
# SQUAD should retry fetching the build until retry == 2
|
254
|
-
raise TemporaryFetchIssue(results.get('status_message', 'TuxSuite Error'))
|
255
253
|
|
256
254
|
# Make metadata
|
257
255
|
metadata_keys = settings.get('BUILD_METADATA_KEYS', [])
|
@@ -270,7 +268,7 @@ class Backend(BaseBackend):
|
|
270
268
|
metrics = {}
|
271
269
|
|
272
270
|
completed = True
|
273
|
-
if
|
271
|
+
if build_status == 'error':
|
274
272
|
# This indicates that TuxSuite gave up trying to work on this build
|
275
273
|
status = 'Incomplete'
|
276
274
|
tests[f'build/{test_name}'] = 'skip'
|
@@ -484,22 +482,18 @@ class Backend(BaseBackend):
|
|
484
482
|
if public_key is None:
|
485
483
|
raise Exception("missing tuxsuite public key for this project")
|
486
484
|
|
487
|
-
payload = json.loads(request.body)
|
488
485
|
signature = base64.urlsafe_b64decode(signature)
|
489
486
|
key = serialization.load_ssh_public_key(public_key.encode("ascii"))
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
487
|
+
try:
|
488
|
+
key.verify(
|
489
|
+
signature,
|
490
|
+
request.body,
|
491
|
+
ec.ECDSA(hashes.SHA256()),
|
492
|
+
)
|
493
|
+
except InvalidSignature:
|
494
|
+
raise Exception("Failed to verify signature against payload")
|
495
495
|
|
496
496
|
def process_callback(self, json_payload, build, environment, backend):
|
497
|
-
# The payload coming from Tuxsuite is formatted as bytes,
|
498
|
-
# so after the first json.loads(request.body), the result
|
499
|
-
# will still be a string containing the actual json document
|
500
|
-
# We need to call json.loads() once more to get the actual
|
501
|
-
# python dict containing all the information we need
|
502
|
-
json_payload = json.loads(json_payload)
|
503
497
|
if "kind" not in json_payload or "status" not in json_payload:
|
504
498
|
raise Exception("`kind` and `status` are required in the payload")
|
505
499
|
|
@@ -0,0 +1,44 @@
|
|
1
|
+
from django.core.management.base import BaseCommand
|
2
|
+
|
3
|
+
from squad.plugins.linux_log_parser import Plugin as BootTestLogParser
|
4
|
+
from squad.plugins.linux_log_parser_build import Plugin as BuildLogParser
|
5
|
+
|
6
|
+
|
7
|
+
class FakeTestRun:
|
8
|
+
log_file = None
|
9
|
+
id = None
|
10
|
+
|
11
|
+
|
12
|
+
log_parsers = {
|
13
|
+
'linux_log_parser_boot_test': BootTestLogParser(),
|
14
|
+
"linux_log_parser_build": BuildLogParser(),
|
15
|
+
}
|
16
|
+
|
17
|
+
|
18
|
+
class Command(BaseCommand):
|
19
|
+
|
20
|
+
help = """Run a log parser and print the outputs to the stdout."""
|
21
|
+
|
22
|
+
def add_arguments(self, parser):
|
23
|
+
|
24
|
+
parser.add_argument(
|
25
|
+
"LOG_FILE",
|
26
|
+
help="Log file to parser",
|
27
|
+
)
|
28
|
+
|
29
|
+
parser.add_argument(
|
30
|
+
"LOG_PARSER",
|
31
|
+
choices=log_parsers.keys(),
|
32
|
+
help="Which log parser to run"
|
33
|
+
)
|
34
|
+
|
35
|
+
def handle(self, *args, **options):
|
36
|
+
self.options = options
|
37
|
+
|
38
|
+
with open(options["LOG_FILE"], "r") as f:
|
39
|
+
log_file = f.read()
|
40
|
+
|
41
|
+
testrun = FakeTestRun()
|
42
|
+
testrun.log_file = log_file
|
43
|
+
parser = log_parsers[options["LOG_PARSER"]]
|
44
|
+
parser.postprocess_testrun(testrun, squad=False, print=True)
|
@@ -577,12 +577,17 @@ class Build(models.Model):
|
|
577
577
|
List of attachments from all testruns
|
578
578
|
"""
|
579
579
|
if self.__attachments__ is None:
|
580
|
+
test_run_ids = self.test_runs.values_list('id', flat=True)
|
581
|
+
all_attachments = Attachment.objects.filter(test_run_id__in=test_run_ids).values(
|
582
|
+
'test_run_id', 'filename'
|
583
|
+
)
|
584
|
+
|
580
585
|
attachments = {}
|
581
|
-
for
|
582
|
-
attachments[
|
583
|
-
|
584
|
-
attachments[test_run.pk].append(attachment.filename)
|
586
|
+
for attachment in all_attachments:
|
587
|
+
attachments.setdefault(attachment['test_run_id'], []).append(attachment['filename'])
|
588
|
+
|
585
589
|
self.__attachments__ = attachments
|
590
|
+
|
586
591
|
return self.__attachments__
|
587
592
|
|
588
593
|
@property
|
@@ -16,8 +16,16 @@ square_brackets_and_contents = r"\[[^\]]+\]"
|
|
16
16
|
|
17
17
|
class BaseLogParser:
|
18
18
|
def compile_regexes(self, regexes):
|
19
|
-
|
20
|
-
|
19
|
+
with_brackets = [r"(%s)" % r[REGEX_BODY] for r in regexes]
|
20
|
+
combined = r"|".join(with_brackets)
|
21
|
+
|
22
|
+
# In the case where there is only one regex, we need to add extra
|
23
|
+
# bracket around it for it to behave the same as the multiple regex
|
24
|
+
# case
|
25
|
+
if len(regexes) == 1:
|
26
|
+
combined = f"({combined})"
|
27
|
+
|
28
|
+
return re.compile(combined, re.S | re.M)
|
21
29
|
|
22
30
|
def remove_numbers_and_time(self, snippet):
|
23
31
|
# [ 1067.461794][ T132] BUG: KCSAN: data-race in do_page_fault spectre_v4_enable_task_mitigation
|
@@ -26,7 +34,11 @@ class BaseLogParser:
|
|
26
34
|
|
27
35
|
# [ .][ T] BUG: KCSAN: data-race in do_page_fault spectre_v_enable_task_mitigation
|
28
36
|
# -> BUG: KCSAN: data-race in do_page_fault spectre_v_enable_task_mitigation
|
29
|
-
without_time = re.sub(
|
37
|
+
without_time = re.sub(
|
38
|
+
f"^{square_brackets_and_contents}({square_brackets_and_contents})?",
|
39
|
+
"",
|
40
|
+
without_numbers,
|
41
|
+
) # noqa
|
30
42
|
|
31
43
|
return without_time
|
32
44
|
|
@@ -41,10 +53,7 @@ class BaseLogParser:
|
|
41
53
|
snippet = matches[0]
|
42
54
|
without_numbers_and_time = self.remove_numbers_and_time(snippet)
|
43
55
|
|
44
|
-
|
45
|
-
# for SuiteMetadata in SQUAD is 256 characters. The SHA and "-" take 65
|
46
|
-
# characters: 256-65=191
|
47
|
-
return slugify(without_numbers_and_time)[:191]
|
56
|
+
return slugify(without_numbers_and_time)
|
48
57
|
|
49
58
|
def create_shasum(self, snippet):
|
50
59
|
sha = hashlib.sha256()
|
@@ -52,7 +61,7 @@ class BaseLogParser:
|
|
52
61
|
sha.update(without_numbers_and_time.encode())
|
53
62
|
return sha.hexdigest()
|
54
63
|
|
55
|
-
def create_name_log_dict(self, test_name, lines, test_regex=None):
|
64
|
+
def create_name_log_dict(self, test_name, lines, test_regex=None, create_shas=True):
|
56
65
|
"""
|
57
66
|
Produce a dictionary with the test names as keys and the extracted logs
|
58
67
|
for that test name as values. There will be at least one test name per
|
@@ -64,31 +73,43 @@ class BaseLogParser:
|
|
64
73
|
# have any output for a particular regex, just use the default name
|
65
74
|
# (for example "check-kernel-oops").
|
66
75
|
tests_without_shas_to_create = defaultdict(set)
|
67
|
-
tests_with_shas_to_create =
|
76
|
+
tests_with_shas_to_create = None
|
68
77
|
|
69
78
|
# If there are lines, then create the tests for these.
|
70
79
|
for line in lines:
|
71
80
|
extracted_name = self.create_name(line, test_regex)
|
72
81
|
if extracted_name:
|
73
|
-
|
82
|
+
max_name_length = 256
|
83
|
+
# If adding SHAs, limit the name length to 191 characters,
|
84
|
+
# since the max name length for SuiteMetadata in SQUAD is 256
|
85
|
+
# characters. The SHA and "-" take 65 characters: 256-65=191
|
86
|
+
if create_shas:
|
87
|
+
max_name_length -= 65
|
88
|
+
extended_test_name = f"{test_name}-{extracted_name}"[:max_name_length]
|
74
89
|
else:
|
75
90
|
extended_test_name = test_name
|
76
91
|
tests_without_shas_to_create[extended_test_name].add(line)
|
77
92
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
93
|
+
if create_shas:
|
94
|
+
tests_with_shas_to_create = defaultdict(set)
|
95
|
+
for name, test_lines in tests_without_shas_to_create.items():
|
96
|
+
# Some lines of the matched regex might be the same, and we don't want to create
|
97
|
+
# multiple tests like test1-sha1, test1-sha1, etc, so we'll create a set of sha1sums
|
98
|
+
# then create only new tests for unique sha's
|
82
99
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
100
|
+
for line in test_lines:
|
101
|
+
sha = self.create_shasum(line)
|
102
|
+
name_with_sha = f"{name}-{sha}"
|
103
|
+
tests_with_shas_to_create[name_with_sha].add(line)
|
87
104
|
|
88
105
|
return tests_without_shas_to_create, tests_with_shas_to_create
|
89
106
|
|
90
107
|
def create_squad_tests_from_name_log_dict(
|
91
|
-
self,
|
108
|
+
self,
|
109
|
+
suite_name,
|
110
|
+
testrun,
|
111
|
+
tests_without_shas_to_create,
|
112
|
+
tests_with_shas_to_create=None,
|
92
113
|
):
|
93
114
|
# Import SuiteMetadata from SQUAD only when required so BaseLogParser
|
94
115
|
# does not require a SQUAD to work. This makes it easier to reuse this
|
@@ -96,6 +117,8 @@ class BaseLogParser:
|
|
96
117
|
# patterns.
|
97
118
|
from squad.core.models import SuiteMetadata
|
98
119
|
|
120
|
+
suite, _ = testrun.build.project.suites.get_or_create(slug=suite_name)
|
121
|
+
|
99
122
|
for name, lines in tests_without_shas_to_create.items():
|
100
123
|
metadata, _ = SuiteMetadata.objects.get_or_create(
|
101
124
|
suite=suite.slug, name=name, kind="test"
|
@@ -108,34 +131,72 @@ class BaseLogParser:
|
|
108
131
|
build=testrun.build,
|
109
132
|
environment=testrun.environment,
|
110
133
|
)
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
134
|
+
if tests_with_shas_to_create:
|
135
|
+
for name_with_sha, lines in tests_with_shas_to_create.items():
|
136
|
+
metadata, _ = SuiteMetadata.objects.get_or_create(
|
137
|
+
suite=suite.slug, name=name_with_sha, kind="test"
|
138
|
+
)
|
139
|
+
testrun.tests.create(
|
140
|
+
suite=suite,
|
141
|
+
result=False,
|
142
|
+
log="\n---\n".join(lines),
|
143
|
+
metadata=metadata,
|
144
|
+
build=testrun.build,
|
145
|
+
environment=testrun.environment,
|
146
|
+
)
|
147
|
+
|
148
|
+
def print_squad_tests_from_name_log_dict(
|
149
|
+
self,
|
150
|
+
suite_name,
|
151
|
+
tests_without_shas_to_create,
|
152
|
+
tests_with_shas_to_create=None,
|
153
|
+
):
|
154
|
+
for name, lines in tests_without_shas_to_create.items():
|
155
|
+
print(f"\nName: {suite_name}/{name}")
|
156
|
+
log = "\n".join(lines)
|
157
|
+
print(f"Log:\n{log}")
|
158
|
+
|
159
|
+
if tests_with_shas_to_create:
|
160
|
+
for name_with_sha, lines in tests_with_shas_to_create.items():
|
161
|
+
print(f"\nName: {suite_name}/{name_with_sha}")
|
162
|
+
log = "\n---\n".join(lines)
|
163
|
+
print(f"Log:\n{log}")
|
164
|
+
|
165
|
+
def create_squad_tests(
|
166
|
+
self,
|
167
|
+
testrun,
|
168
|
+
suite_name,
|
169
|
+
test_name,
|
170
|
+
lines,
|
171
|
+
test_regex=None,
|
172
|
+
create_shas=True,
|
173
|
+
print=False,
|
174
|
+
squad=True,
|
175
|
+
):
|
125
176
|
"""
|
126
177
|
There will be at least one test per regex. If there were any match for
|
127
178
|
a given regex, then a new test will be generated using test_name +
|
128
179
|
shasum. This helps comparing kernel logs across different builds
|
129
180
|
"""
|
181
|
+
|
130
182
|
tests_without_shas_to_create, tests_with_shas_to_create = (
|
131
|
-
self.create_name_log_dict(
|
132
|
-
|
133
|
-
|
134
|
-
suite,
|
135
|
-
testrun,
|
136
|
-
tests_without_shas_to_create,
|
137
|
-
tests_with_shas_to_create,
|
183
|
+
self.create_name_log_dict(
|
184
|
+
test_name, lines, test_regex, create_shas=create_shas
|
185
|
+
)
|
138
186
|
)
|
187
|
+
if print:
|
188
|
+
self.print_squad_tests_from_name_log_dict(
|
189
|
+
suite_name,
|
190
|
+
tests_without_shas_to_create,
|
191
|
+
tests_with_shas_to_create,
|
192
|
+
)
|
193
|
+
if squad:
|
194
|
+
self.create_squad_tests_from_name_log_dict(
|
195
|
+
suite_name,
|
196
|
+
testrun,
|
197
|
+
tests_without_shas_to_create,
|
198
|
+
tests_with_shas_to_create,
|
199
|
+
)
|
139
200
|
|
140
201
|
def join_matches(self, matches, regexes):
|
141
202
|
"""
|
@@ -0,0 +1,72 @@
|
|
1
|
+
import logging
|
2
|
+
import re
|
3
|
+
from squad.plugins import Plugin as BasePlugin
|
4
|
+
from squad.plugins.lib.base_log_parser import BaseLogParser, REGEX_NAME, REGEX_EXTRACT_NAME, tstamp, pid, not_newline_or_plus
|
5
|
+
|
6
|
+
logger = logging.getLogger()
|
7
|
+
|
8
|
+
MULTILINERS = [
|
9
|
+
('exception', fr'-+\[? cut here \]?-+.*?{tstamp}{pid}?\s+-+\[? end trace \w* \]?-+', fr"\n{tstamp}{not_newline_or_plus}*"), # noqa
|
10
|
+
('kasan', fr'{tstamp}{pid}?\s+=+\n{tstamp}{pid}?\s+BUG: KASAN:.*?\n*?{tstamp}{pid}?\s+=+', fr"BUG: KASAN:{not_newline_or_plus}*"), # noqa
|
11
|
+
('kcsan', fr'{tstamp}{pid}?\s+=+\n{tstamp}{pid}?\s+BUG: KCSAN:.*?=+', fr"BUG: KCSAN:{not_newline_or_plus}*"), # noqa
|
12
|
+
('kfence', fr'{tstamp}{pid}?\s+=+\n{tstamp}{pid}?\s+BUG: KFENCE:.*?{tstamp}{pid}?\s+=+', fr"BUG: KFENCE:{not_newline_or_plus}*"), # noqa
|
13
|
+
('panic-multiline', fr'{tstamp}{pid}?\s+Kernel panic - [^\n]+\n.*?-+\[? end Kernel panic - [^\n]+ \]?-*', fr"Kernel {not_newline_or_plus}*"), # noqa
|
14
|
+
('internal-error-oops', fr'{tstamp}{pid}?\s+Internal error: Oops.*?-+\[? end trace \w+ \]?-+', fr"Oops{not_newline_or_plus}*"), # noqa
|
15
|
+
]
|
16
|
+
|
17
|
+
ONELINERS = [
|
18
|
+
('oops', r'^[^\n]+Oops(?: -|:).*?$', fr"Oops{not_newline_or_plus}*"), # noqa
|
19
|
+
('fault', r'^[^\n]+Unhandled fault.*?$', fr"Unhandled {not_newline_or_plus}*"), # noqa
|
20
|
+
('warning', r'^[^\n]+WARNING:.*?$', fr"WARNING:{not_newline_or_plus}*"), # noqa
|
21
|
+
('bug', r'^[^\n]+(?: kernel BUG at|BUG:).*?$', fr"BUG{not_newline_or_plus}*"), # noqa
|
22
|
+
('invalid-opcode', r'^[^\n]+invalid opcode:.*?$', fr"invalid opcode:{not_newline_or_plus}*"), # noqa
|
23
|
+
('panic', r'Kernel panic - not syncing.*?$', fr"Kernel {not_newline_or_plus}*"), # noqa
|
24
|
+
]
|
25
|
+
|
26
|
+
# Tip: broader regexes should come first
|
27
|
+
REGEXES = MULTILINERS + ONELINERS
|
28
|
+
|
29
|
+
|
30
|
+
class Plugin(BasePlugin, BaseLogParser):
|
31
|
+
def __cutoff_boot_log(self, log):
|
32
|
+
# Attempt to split the log in " login:"
|
33
|
+
logs = log.split(' login:', 1)
|
34
|
+
|
35
|
+
# 1 string means no split was done, consider all logs as test log
|
36
|
+
if len(logs) == 1:
|
37
|
+
return '', log
|
38
|
+
|
39
|
+
boot_log = logs[0]
|
40
|
+
test_log = logs[1]
|
41
|
+
return boot_log, test_log
|
42
|
+
|
43
|
+
def __kernel_msgs_only(self, log):
|
44
|
+
kernel_msgs = re.findall(f'({tstamp}{pid}? .*?)$', log, re.S | re.M) # noqa
|
45
|
+
return '\n'.join(kernel_msgs)
|
46
|
+
|
47
|
+
def postprocess_testrun(self, testrun, squad=True, print=False):
|
48
|
+
# If running as a SQUAD plugin, only run the boot/test log parser if this is not a build testrun
|
49
|
+
if testrun.log_file is None or (squad and testrun.tests.filter(suite__slug="build").exists()):
|
50
|
+
return
|
51
|
+
|
52
|
+
boot_log, test_log = self.__cutoff_boot_log(testrun.log_file)
|
53
|
+
logs = {
|
54
|
+
'boot': boot_log,
|
55
|
+
'test': test_log,
|
56
|
+
}
|
57
|
+
|
58
|
+
for log_type, log in logs.items():
|
59
|
+
log = self.__kernel_msgs_only(log)
|
60
|
+
suite_name = f'log-parser-{log_type}'
|
61
|
+
|
62
|
+
regex = self.compile_regexes(REGEXES)
|
63
|
+
matches = regex.findall(log)
|
64
|
+
snippets = self.join_matches(matches, REGEXES)
|
65
|
+
|
66
|
+
for regex_id in range(len(REGEXES)):
|
67
|
+
test_name = REGEXES[regex_id][REGEX_NAME]
|
68
|
+
regex_pattern = REGEXES[regex_id][REGEX_EXTRACT_NAME]
|
69
|
+
test_name_regex = None
|
70
|
+
if regex_pattern:
|
71
|
+
test_name_regex = re.compile(regex_pattern, re.S | re.M)
|
72
|
+
self.create_squad_tests(testrun, suite_name, test_name, snippets[regex_id], test_name_regex, squad=squad, print=print)
|