squad 1.95__tar.gz → 1.96.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of squad might be problematic. Click here for more details.

Files changed (669) hide show
  1. {squad-1.95 → squad-1.96.1}/CHANGELOG.md +10 -0
  2. {squad-1.95/squad.egg-info → squad-1.96.1}/PKG-INFO +1 -2
  3. {squad-1.95 → squad-1.96.1}/doc/api.rst +1 -1
  4. {squad-1.95 → squad-1.96.1}/requirements-dev.txt +0 -1
  5. {squad-1.95 → squad-1.96.1}/requirements.txt +0 -1
  6. {squad-1.95 → squad-1.96.1}/squad/ci/backend/tuxsuite.py +32 -11
  7. {squad-1.95 → squad-1.96.1}/squad/ci/management/commands/testfetch.py +8 -1
  8. {squad-1.95 → squad-1.96.1}/squad/core/models.py +56 -30
  9. {squad-1.95 → squad-1.96.1}/squad/jinja2.py +1 -1
  10. squad-1.96.1/squad/version.py +1 -0
  11. {squad-1.95 → squad-1.96.1/squad.egg-info}/PKG-INFO +1 -2
  12. {squad-1.95 → squad-1.96.1}/squad.egg-info/SOURCES.txt +0 -2
  13. {squad-1.95 → squad-1.96.1}/squad.egg-info/requires.txt +0 -1
  14. {squad-1.95 → squad-1.96.1}/test/ci/backend/test_tuxsuite.py +43 -14
  15. {squad-1.95 → squad-1.96.1}/test/ci/backend/tuxsuite_test_result_sample.json +25 -13
  16. {squad-1.95 → squad-1.96.1}/test/core/test_build.py +4 -1
  17. squad-1.95/squad/version.py +0 -1
  18. squad-1.95/test/integration/plugins/test_tradefed.py +0 -161
  19. squad-1.95/test/integration/plugins/tradefed-output-20220608105250.tar.xz +0 -0
  20. {squad-1.95 → squad-1.96.1}/.ackrc +0 -0
  21. {squad-1.95 → squad-1.96.1}/.coveragerc +0 -0
  22. {squad-1.95 → squad-1.96.1}/.ctags +0 -0
  23. {squad-1.95 → squad-1.96.1}/.dockerignore +0 -0
  24. {squad-1.95 → squad-1.96.1}/.gitignore +0 -0
  25. {squad-1.95 → squad-1.96.1}/.mailmap +0 -0
  26. {squad-1.95 → squad-1.96.1}/.readthedocs.yml +0 -0
  27. {squad-1.95 → squad-1.96.1}/.reuse/dep5 +0 -0
  28. {squad-1.95 → squad-1.96.1}/COPYING +0 -0
  29. {squad-1.95 → squad-1.96.1}/COPYRIGHTS +0 -0
  30. {squad-1.95 → squad-1.96.1}/Dockerfile +0 -0
  31. {squad-1.95 → squad-1.96.1}/LICENSES/GPL-3.0-or-later.txt +0 -0
  32. {squad-1.95 → squad-1.96.1}/LICENSES/MIT.txt +0 -0
  33. {squad-1.95 → squad-1.96.1}/LICENSES/OFL-1.1.txt +0 -0
  34. {squad-1.95 → squad-1.96.1}/MANIFEST.in +0 -0
  35. {squad-1.95 → squad-1.96.1}/Procfile +0 -0
  36. {squad-1.95 → squad-1.96.1}/README.rst +0 -0
  37. {squad-1.95 → squad-1.96.1}/babel.cfg +0 -0
  38. {squad-1.95 → squad-1.96.1}/dev-docker +0 -0
  39. {squad-1.95 → squad-1.96.1}/doc/.gitignore +0 -0
  40. {squad-1.95 → squad-1.96.1}/doc/Makefile +0 -0
  41. {squad-1.95 → squad-1.96.1}/doc/ci.rst +0 -0
  42. {squad-1.95 → squad-1.96.1}/doc/conf.py +0 -0
  43. {squad-1.95 → squad-1.96.1}/doc/hacking.rst +0 -0
  44. {squad-1.95 → squad-1.96.1}/doc/index.rst +0 -0
  45. {squad-1.95 → squad-1.96.1}/doc/install.rst +0 -0
  46. {squad-1.95 → squad-1.96.1}/doc/intro.rst +0 -0
  47. {squad-1.95 → squad-1.96.1}/doc/lava_usecase.rst +0 -0
  48. {squad-1.95 → squad-1.96.1}/doc/plugins.rst +0 -0
  49. {squad-1.95 → squad-1.96.1}/doc/quickstart.rst +0 -0
  50. {squad-1.95 → squad-1.96.1}/doc/translating.rst +0 -0
  51. {squad-1.95 → squad-1.96.1}/doc/tuxsuite_usecase.rst +0 -0
  52. {squad-1.95 → squad-1.96.1}/docker/db-dumped +0 -0
  53. {squad-1.95 → squad-1.96.1}/docker/db-to-be-restored +0 -0
  54. {squad-1.95 → squad-1.96.1}/docker/docker-compose.yml +0 -0
  55. {squad-1.95 → squad-1.96.1}/docker/extra_settings.py +0 -0
  56. {squad-1.95 → squad-1.96.1}/docker/init-db.sh +0 -0
  57. {squad-1.95 → squad-1.96.1}/docker/rabbitmq.config +0 -0
  58. {squad-1.95 → squad-1.96.1}/docker/squad-apache.conf +0 -0
  59. {squad-1.95 → squad-1.96.1}/docker-compose.yaml +0 -0
  60. {squad-1.95 → squad-1.96.1}/manage.py +0 -0
  61. {squad-1.95 → squad-1.96.1}/package-lock.json +0 -0
  62. {squad-1.95 → squad-1.96.1}/package.json +0 -0
  63. {squad-1.95 → squad-1.96.1}/pytest.ini +0 -0
  64. {squad-1.95 → squad-1.96.1}/scripts/build +0 -0
  65. {squad-1.95 → squad-1.96.1}/scripts/check-ci +0 -0
  66. {squad-1.95 → squad-1.96.1}/scripts/check-ignore +0 -0
  67. {squad-1.95 → squad-1.96.1}/scripts/community_connector/main.js +0 -0
  68. {squad-1.95 → squad-1.96.1}/scripts/community_connector/manifest.json +0 -0
  69. {squad-1.95 → squad-1.96.1}/scripts/dogfood +0 -0
  70. {squad-1.95 → squad-1.96.1}/scripts/get-metrics +0 -0
  71. {squad-1.95 → squad-1.96.1}/scripts/get-tests +0 -0
  72. {squad-1.95 → squad-1.96.1}/scripts/git-build +0 -0
  73. {squad-1.95 → squad-1.96.1}/scripts/pytest +0 -0
  74. {squad-1.95 → squad-1.96.1}/scripts/rabbitmq-server +0 -0
  75. {squad-1.95 → squad-1.96.1}/scripts/release +0 -0
  76. {squad-1.95 → squad-1.96.1}/scripts/release-docker +0 -0
  77. {squad-1.95 → squad-1.96.1}/scripts/squad-config +0 -0
  78. {squad-1.95 → squad-1.96.1}/scripts/test-ci +0 -0
  79. {squad-1.95 → squad-1.96.1}/scripts/test-docker +0 -0
  80. {squad-1.95 → squad-1.96.1}/scripts/testdata/gen-ci-jobs +0 -0
  81. {squad-1.95 → squad-1.96.1}/scripts/testdata/gen-metrics +0 -0
  82. {squad-1.95 → squad-1.96.1}/scripts/testdata/gen-test-data +0 -0
  83. {squad-1.95 → squad-1.96.1}/scripts/testdata/gen-tests +0 -0
  84. {squad-1.95 → squad-1.96.1}/scripts/testdata/setup-dev +0 -0
  85. {squad-1.95 → squad-1.96.1}/scripts/testdata/submit-ci-jobs +0 -0
  86. {squad-1.95 → squad-1.96.1}/scripts/testdata/submit-test-data +0 -0
  87. {squad-1.95 → squad-1.96.1}/scripts/translate +0 -0
  88. {squad-1.95 → squad-1.96.1}/scripts/travis-lava +0 -0
  89. {squad-1.95 → squad-1.96.1}/scripts/update-translation-files +0 -0
  90. {squad-1.95 → squad-1.96.1}/setup.cfg +0 -0
  91. {squad-1.95 → squad-1.96.1}/setup.py +0 -0
  92. {squad-1.95 → squad-1.96.1}/squad/__init__.py +0 -0
  93. {squad-1.95 → squad-1.96.1}/squad/admin.py +0 -0
  94. {squad-1.95 → squad-1.96.1}/squad/api/__init__.py +0 -0
  95. {squad-1.95 → squad-1.96.1}/squad/api/apps.py +0 -0
  96. {squad-1.95 → squad-1.96.1}/squad/api/ci.py +0 -0
  97. {squad-1.95 → squad-1.96.1}/squad/api/data.py +0 -0
  98. {squad-1.95 → squad-1.96.1}/squad/api/filters.py +0 -0
  99. {squad-1.95 → squad-1.96.1}/squad/api/prometheus.py +0 -0
  100. {squad-1.95 → squad-1.96.1}/squad/api/rest.py +0 -0
  101. {squad-1.95 → squad-1.96.1}/squad/api/urls.py +0 -0
  102. {squad-1.95 → squad-1.96.1}/squad/api/utils.py +0 -0
  103. {squad-1.95 → squad-1.96.1}/squad/api/views.py +0 -0
  104. {squad-1.95 → squad-1.96.1}/squad/celery.py +0 -0
  105. {squad-1.95 → squad-1.96.1}/squad/ci/__init__.py +0 -0
  106. {squad-1.95 → squad-1.96.1}/squad/ci/admin.py +0 -0
  107. {squad-1.95 → squad-1.96.1}/squad/ci/apps.py +0 -0
  108. {squad-1.95 → squad-1.96.1}/squad/ci/backend/__init__.py +0 -0
  109. {squad-1.95 → squad-1.96.1}/squad/ci/backend/fake.py +0 -0
  110. {squad-1.95 → squad-1.96.1}/squad/ci/backend/lava.py +0 -0
  111. {squad-1.95 → squad-1.96.1}/squad/ci/backend/null.py +0 -0
  112. {squad-1.95 → squad-1.96.1}/squad/ci/exceptions.py +0 -0
  113. {squad-1.95 → squad-1.96.1}/squad/ci/management/__init__.py +0 -0
  114. {squad-1.95 → squad-1.96.1}/squad/ci/management/commands/__init__.py +0 -0
  115. {squad-1.95 → squad-1.96.1}/squad/ci/management/commands/create_tuxsuite_boot_tests.py +0 -0
  116. {squad-1.95 → squad-1.96.1}/squad/ci/management/commands/listen.py +0 -0
  117. {squad-1.95 → squad-1.96.1}/squad/ci/migrations/0001_initial.py +0 -0
  118. {squad-1.95 → squad-1.96.1}/squad/ci/migrations/0002_auto_20170406_1252.py +0 -0
  119. {squad-1.95 → squad-1.96.1}/squad/ci/migrations/0003_backend_name.py +0 -0
  120. {squad-1.95 → squad-1.96.1}/squad/ci/migrations/0004_testjob_failure.py +0 -0
  121. {squad-1.95 → squad-1.96.1}/squad/ci/migrations/0005_remove_listener_data.py +0 -0
  122. {squad-1.95 → squad-1.96.1}/squad/ci/migrations/0006_simplify_backend_loading.py +0 -0
  123. {squad-1.95 → squad-1.96.1}/squad/ci/migrations/0007_auto_20170517_1736.py +0 -0
  124. {squad-1.95 → squad-1.96.1}/squad/ci/migrations/0008_testjob_testrun.py +0 -0
  125. {squad-1.95 → squad-1.96.1}/squad/ci/migrations/0009_slug_pattern.py +0 -0
  126. {squad-1.95 → squad-1.96.1}/squad/ci/migrations/0010_testjob_can_resubmit.py +0 -0
  127. {squad-1.95 → squad-1.96.1}/squad/ci/migrations/0011_testjob_resubmitted_count.py +0 -0
  128. {squad-1.95 → squad-1.96.1}/squad/ci/migrations/0012_testjob_build.py +0 -0
  129. {squad-1.95 → squad-1.96.1}/squad/ci/migrations/0013_testjob_name.py +0 -0
  130. {squad-1.95 → squad-1.96.1}/squad/ci/migrations/0014_testjob_target_build.py +0 -0
  131. {squad-1.95 → squad-1.96.1}/squad/ci/migrations/0015_testjob_populate_target_build.py +0 -0
  132. {squad-1.95 → squad-1.96.1}/squad/ci/migrations/0016_backend_max_fetch_attempts.py +0 -0
  133. {squad-1.95 → squad-1.96.1}/squad/ci/migrations/0017_testjob_fetch_attempts.py +0 -0
  134. {squad-1.95 → squad-1.96.1}/squad/ci/migrations/0018_testjob_dates.py +0 -0
  135. {squad-1.95 → squad-1.96.1}/squad/ci/migrations/0019_add_fake_backend.py +0 -0
  136. {squad-1.95 → squad-1.96.1}/squad/ci/migrations/0020_backend_settings_field.py +0 -0
  137. {squad-1.95 → squad-1.96.1}/squad/ci/migrations/0021_testjob_parent_job.py +0 -0
  138. {squad-1.95 → squad-1.96.1}/squad/ci/migrations/0022_backend_poll_enabled.py +0 -0
  139. {squad-1.95 → squad-1.96.1}/squad/ci/migrations/0023_remove_testjob_build.py +0 -0
  140. {squad-1.95 → squad-1.96.1}/squad/ci/migrations/0024_fix_testjob_environment_validation.py +0 -0
  141. {squad-1.95 → squad-1.96.1}/squad/ci/migrations/0025_backend_listen_enabled.py +0 -0
  142. {squad-1.95 → squad-1.96.1}/squad/ci/migrations/0026_job_start_end_time.py +0 -0
  143. {squad-1.95 → squad-1.96.1}/squad/ci/migrations/0027_add_tuxsuite_implementation_type.py +0 -0
  144. {squad-1.95 → squad-1.96.1}/squad/ci/migrations/0028_create_testjob_indexes.py +0 -0
  145. {squad-1.95 → squad-1.96.1}/squad/ci/migrations/0029_create_testjob_results_input.py +0 -0
  146. {squad-1.95 → squad-1.96.1}/squad/ci/migrations/0030_testjob_subtasks_count.py +0 -0
  147. {squad-1.95 → squad-1.96.1}/squad/ci/migrations/__init__.py +0 -0
  148. {squad-1.95 → squad-1.96.1}/squad/ci/models.py +0 -0
  149. {squad-1.95 → squad-1.96.1}/squad/ci/tasks.py +0 -0
  150. {squad-1.95 → squad-1.96.1}/squad/ci/templates/squad/ci/testjob_resubmit.html.jinja2 +0 -0
  151. {squad-1.95 → squad-1.96.1}/squad/ci/templates/squad/ci/testjob_resubmit.txt.jinja2 +0 -0
  152. {squad-1.95 → squad-1.96.1}/squad/ci/templatetags/__init__.py +0 -0
  153. {squad-1.95 → squad-1.96.1}/squad/ci/templatetags/filter_jobs.py +0 -0
  154. {squad-1.95 → squad-1.96.1}/squad/ci/utils.py +0 -0
  155. {squad-1.95 → squad-1.96.1}/squad/compat.py +0 -0
  156. {squad-1.95 → squad-1.96.1}/squad/container_settings.py +0 -0
  157. {squad-1.95 → squad-1.96.1}/squad/core/__init__.py +0 -0
  158. {squad-1.95 → squad-1.96.1}/squad/core/admin.py +0 -0
  159. {squad-1.95 → squad-1.96.1}/squad/core/apps.py +0 -0
  160. {squad-1.95 → squad-1.96.1}/squad/core/callback.py +0 -0
  161. {squad-1.95 → squad-1.96.1}/squad/core/comparison.py +0 -0
  162. {squad-1.95 → squad-1.96.1}/squad/core/data.py +0 -0
  163. {squad-1.95 → squad-1.96.1}/squad/core/failures.py +0 -0
  164. {squad-1.95 → squad-1.96.1}/squad/core/history.py +0 -0
  165. {squad-1.95 → squad-1.96.1}/squad/core/locale/django.pot +0 -0
  166. {squad-1.95 → squad-1.96.1}/squad/core/locale/es_MX/LC_MESSAGES/django.po +0 -0
  167. {squad-1.95 → squad-1.96.1}/squad/core/locale/pl/LC_MESSAGES/django.po +0 -0
  168. {squad-1.95 → squad-1.96.1}/squad/core/locale/pt/LC_MESSAGES/django.po +0 -0
  169. {squad-1.95 → squad-1.96.1}/squad/core/locale/pt_BR/LC_MESSAGES/django.po +0 -0
  170. {squad-1.95 → squad-1.96.1}/squad/core/management/__init__.py +0 -0
  171. {squad-1.95 → squad-1.96.1}/squad/core/management/commands/__init__.py +0 -0
  172. {squad-1.95 → squad-1.96.1}/squad/core/management/commands/compute_build_summaries.py +0 -0
  173. {squad-1.95 → squad-1.96.1}/squad/core/management/commands/compute_project_statuses.py +0 -0
  174. {squad-1.95 → squad-1.96.1}/squad/core/management/commands/fill_test_metadata.py +0 -0
  175. {squad-1.95 → squad-1.96.1}/squad/core/management/commands/fix_squadplugin_data.py +0 -0
  176. {squad-1.95 → squad-1.96.1}/squad/core/management/commands/import_data.py +0 -0
  177. {squad-1.95 → squad-1.96.1}/squad/core/management/commands/import_data.rst +0 -0
  178. {squad-1.95 → squad-1.96.1}/squad/core/management/commands/migrate_test_runs.py +0 -0
  179. {squad-1.95 → squad-1.96.1}/squad/core/management/commands/populate_metric_build_and_environment.py +0 -0
  180. {squad-1.95 → squad-1.96.1}/squad/core/management/commands/populate_test_build_and_environment.py +0 -0
  181. {squad-1.95 → squad-1.96.1}/squad/core/management/commands/prepdump.py +0 -0
  182. {squad-1.95 → squad-1.96.1}/squad/core/management/commands/run_log_parser.py +0 -0
  183. {squad-1.95 → squad-1.96.1}/squad/core/management/commands/send-email.py +0 -0
  184. {squad-1.95 → squad-1.96.1}/squad/core/management/commands/update_project_statuses.py +0 -0
  185. {squad-1.95 → squad-1.96.1}/squad/core/management/commands/users.py +0 -0
  186. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0001_initial.py +0 -0
  187. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0002_auto_20160525_1403.py +0 -0
  188. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0003_testrun_log_file.py +0 -0
  189. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0004_group_user_groups.py +0 -0
  190. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0005_token.py +0 -0
  191. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0006_auto_20160826_2242.py +0 -0
  192. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0007_testrun_data_processed.py +0 -0
  193. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0008_status.py +0 -0
  194. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0009_testrun_status_recorded.py +0 -0
  195. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0010_testrun_datetime.py +0 -0
  196. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0011_testrun_metadata_fields.py +0 -0
  197. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0012_build_datetime.py +0 -0
  198. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0013_testrun_resubmit_url.py +0 -0
  199. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0014_testrun_metadata_file.py +0 -0
  200. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0015_attachment.py +0 -0
  201. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0016_project_is_public.py +0 -0
  202. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0017_slug_validator.py +0 -0
  203. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0018_build_name.py +0 -0
  204. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0019_build_version.py +0 -0
  205. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0020_build_ordering.py +0 -0
  206. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0021_global_tokens.py +0 -0
  207. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0022_projectstatus.py +0 -0
  208. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0023_subscription.py +0 -0
  209. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0024_project_build_completion_threshold.py +0 -0
  210. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0025_unique_testrun_job_id.py +0 -0
  211. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0026_testrun_result_accept_null.py +0 -0
  212. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0027_project_notification_strategy.py +0 -0
  213. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0028_suite_and_test_name_length.py +0 -0
  214. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0029_subscription_email_formats.py +0 -0
  215. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0030_remove_project_build_completion_threshold.py +0 -0
  216. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0031_environment_expected_test_runs.py +0 -0
  217. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0032_testrun_completed.py +0 -0
  218. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0033_drop_debversion.py +0 -0
  219. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0034_prepare_to_remove_build_name.py +0 -0
  220. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0035_remove_build_name.py +0 -0
  221. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0036_status_tests_skip.py +0 -0
  222. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0037_project_status_test_summary_fields.py +0 -0
  223. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0038_populate_project_status_cache.py +0 -0
  224. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0039_orderings.py +0 -0
  225. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0040_remove_subscription_html.py +0 -0
  226. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0041_projectstatus_notified.py +0 -0
  227. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0042_set_projectstatus_notified.py +0 -0
  228. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0043_project_status_build.py +0 -0
  229. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0044_project_html_mail.py +0 -0
  230. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0045_adminsubscription.py +0 -0
  231. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0046_projectstatus_last_updated.py +0 -0
  232. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0047_populate_projectstatus_last_updated.py +0 -0
  233. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0048_moderate_notifications.py +0 -0
  234. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0049_projectstatus_plural.py +0 -0
  235. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0050_projectstatus_finished.py +0 -0
  236. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0051_build_status.py +0 -0
  237. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0052_recreate_projectstatus_data.py +0 -0
  238. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0053_remove_projectstatus_previous.py +0 -0
  239. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0054_custom_email_template.py +0 -0
  240. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0055_emailtemplate_subject.py +0 -0
  241. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0056_project_description.py +0 -0
  242. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0057_projectstatus_has_metrics.py +0 -0
  243. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0058_populate_projectstatus_has_metrics.py +0 -0
  244. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0059_project_important_metadata_keys.py +0 -0
  245. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0060_test_log.py +0 -0
  246. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0061_project_enabled_plugins_list.py +0 -0
  247. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0062_project_allow_empty_enabled_plugin_list.py +0 -0
  248. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0063_project_wait_before_notification.py +0 -0
  249. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0064_project_notification_timeout.py +0 -0
  250. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0065_projectstatus_notified_on_timeout.py +0 -0
  251. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0066_environment_description.py +0 -0
  252. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0067_accept_blank_suite_name.py +0 -0
  253. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0068_suite_version.py +0 -0
  254. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0069_suite_metadata.py +0 -0
  255. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0070_create_suite_test_and_metric_metadata.py +0 -0
  256. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0071_migrate_old_tokens.py +0 -0
  257. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0072_group_description.py +0 -0
  258. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0073_auto_20180420_1643.py +0 -0
  259. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0074_add_indexes.py +0 -0
  260. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0075_update_project_enabled_plugin_list.py +0 -0
  261. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0076_patch_builds.py +0 -0
  262. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0077_knownissue.py +0 -0
  263. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0078_cache_test_run_counts.py +0 -0
  264. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0079_init_cache_test_run_counts.py +0 -0
  265. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0080_auto_20180810_0047.py +0 -0
  266. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0081_status_has_metrics.py +0 -0
  267. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0082_populate_status_has_metrics.py +0 -0
  268. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0083_rename_knownissue_environments.py +0 -0
  269. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0084_projectstatus_regressions_fixes.py +0 -0
  270. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0085_projectstatus_defaults.py +0 -0
  271. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0086_xfail.py +0 -0
  272. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0087_test_known_issues.py +0 -0
  273. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0088_user_subscriptions.py +0 -0
  274. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0089_test_has_known_issues.py +0 -0
  275. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0090_populate_test_has_known_issues.py +0 -0
  276. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0091_notification_delivery_remove_unique_status.py +0 -0
  277. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0092_annotation.py +0 -0
  278. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0093_historicalemailtemplate.py +0 -0
  279. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0094_populatehistoricalemailtemplate.py +0 -0
  280. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0095_project_data_retention_days.py +0 -0
  281. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0096_build_keep_data.py +0 -0
  282. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0097_build_placeholder.py +0 -0
  283. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0098_blank_annotation.py +0 -0
  284. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0099_metricthreshold.py +0 -0
  285. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0100_metric_is_outlier.py +0 -0
  286. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0101_project_project_settings.py +0 -0
  287. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0102_projectstatus_null_metric_summary.py +0 -0
  288. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0103_populate_project_status.py +0 -0
  289. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0104_delayedreport.py +0 -0
  290. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0105_delayed_report_error_message.py +0 -0
  291. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0106_delayedreport_output_subject.py +0 -0
  292. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0107_move_notification_strategy.py +0 -0
  293. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0108_add_email_template_validator.py +0 -0
  294. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0109_group_member.py +0 -0
  295. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0110_move_users_from_django_groups_to_squad_groups.py +0 -0
  296. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0111_remove_group_user_groups.py +0 -0
  297. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0112_user_namespaces.py +0 -0
  298. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0113_group_project_blank_name_and_description.py +0 -0
  299. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0114_project_enabled_plugin_list_can_be_blank.py +0 -0
  300. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0115_fix_slug_validation.py +0 -0
  301. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0116_make_group_membership_unique.py +0 -0
  302. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0117_drop_obsolete_token_model.py +0 -0
  303. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0118_project_is_archived.py +0 -0
  304. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0119_i18n.py +0 -0
  305. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0120_buildsummary.py +0 -0
  306. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0121_add_password_patchsource.py +0 -0
  307. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0122_fix_patchsource_url_and_token.py +0 -0
  308. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0123_django_upgrade_missing_migrations.py +0 -0
  309. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0124_set_default_expected_test_runs_to_zero.py +0 -0
  310. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0125_fix_missing_status_has_metrics_for_testruns.py +0 -0
  311. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0126_metricthreshold_environment.py +0 -0
  312. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0127_metric_thresholds_migrate_data.py +0 -0
  313. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0128_metric_thresholds_remove_proj_col.py +0 -0
  314. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0129_projectstatus_nullable_notified_on_timeout.py +0 -0
  315. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0130_project_status_baseline_next.py +0 -0
  316. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0131_create_squad_auth_group_and_add_users.py +0 -0
  317. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0132_attachment_mimetype.py +0 -0
  318. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0133_append_project_permissions_to_squad_auth_group.py +0 -0
  319. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0134_longer_metric_name.py +0 -0
  320. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0135_add_privileged_access_level.py +0 -0
  321. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0136_migrate_submitters_to_privileged.py +0 -0
  322. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0137_patchsource_token_null.py +0 -0
  323. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0138_metric_unit.py +0 -0
  324. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0139_nullable_test_name.py +0 -0
  325. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0140_increase_gerrit_password_length.py +0 -0
  326. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0141_remove_test_name.py +0 -0
  327. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0142_add_testrun_file_storage.py +0 -0
  328. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0143_attachment_storage.py +0 -0
  329. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0144_attachment_data_null.py +0 -0
  330. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0145_pluginscratch.py +0 -0
  331. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0146_deprecate_testrun_and_attachment_data_fields.py +0 -0
  332. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0147_add_build_and_environment_to_test.py +0 -0
  333. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0148_remove_legacy_storage_fields.py +0 -0
  334. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0149_build_patch_url.py +0 -0
  335. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0150_add_new_notification_strategy.py +0 -0
  336. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0151_callback.py +0 -0
  337. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0152_add_build_patch_notified.py +0 -0
  338. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0153_callback_make_response_content_blob.py +0 -0
  339. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0154_project_add_force_finishing_builds_field.py +0 -0
  340. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0155_add_build_and_environment_to_metric.py +0 -0
  341. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0156_nullable_metric_name.py +0 -0
  342. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0157_remove_metric_name.py +0 -0
  343. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0158_add_metric_comparison_to_projectstatus.py +0 -0
  344. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0159_nullable_metricthreshold_value.py +0 -0
  345. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0160_add_project_to_metricthreshold.py +0 -0
  346. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0161_add_metricthreshold_perm_to_squad_group.py +0 -0
  347. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0162_project_add_build_confidence_settings.py +0 -0
  348. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0163_hirtoricalemailtemplate_update.py +0 -0
  349. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0164_django_update.py +0 -0
  350. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0165_buildsummary_uniqueness.py +0 -0
  351. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0166_build_is_release.py +0 -0
  352. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0167_add_project_datetime.py +0 -0
  353. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0168_add_group_settings.py +0 -0
  354. {squad-1.95 → squad-1.96.1}/squad/core/migrations/0169_userpreferences.py +0 -0
  355. {squad-1.95 → squad-1.96.1}/squad/core/migrations/__init__.py +0 -0
  356. {squad-1.95 → squad-1.96.1}/squad/core/notification.py +0 -0
  357. {squad-1.95 → squad-1.96.1}/squad/core/plugins.py +0 -0
  358. {squad-1.95 → squad-1.96.1}/squad/core/queries.py +0 -0
  359. {squad-1.95 → squad-1.96.1}/squad/core/statistics.py +0 -0
  360. {squad-1.95 → squad-1.96.1}/squad/core/tasks/__init__.py +0 -0
  361. {squad-1.95 → squad-1.96.1}/squad/core/tasks/exceptions.py +0 -0
  362. {squad-1.95 → squad-1.96.1}/squad/core/tasks/notification.py +0 -0
  363. {squad-1.95 → squad-1.96.1}/squad/core/templates/squad/notification/base.jinja2 +0 -0
  364. {squad-1.95 → squad-1.96.1}/squad/core/templates/squad/notification/diff.html.jinja2 +0 -0
  365. {squad-1.95 → squad-1.96.1}/squad/core/templates/squad/notification/diff.txt.jinja2 +0 -0
  366. {squad-1.95 → squad-1.96.1}/squad/core/templates/squad/notification/failed_test_jobs.html.jinja2 +0 -0
  367. {squad-1.95 → squad-1.96.1}/squad/core/templates/squad/notification/failed_test_jobs.txt.jinja2 +0 -0
  368. {squad-1.95 → squad-1.96.1}/squad/core/templates/squad/notification/moderation.html.jinja2 +0 -0
  369. {squad-1.95 → squad-1.96.1}/squad/core/templates/squad/notification/moderation.txt.jinja2 +0 -0
  370. {squad-1.95 → squad-1.96.1}/squad/core/templatetags/__init__.py +0 -0
  371. {squad-1.95 → squad-1.96.1}/squad/core/templatetags/squad_notification.py +0 -0
  372. {squad-1.95 → squad-1.96.1}/squad/core/utils.py +0 -0
  373. {squad-1.95 → squad-1.96.1}/squad/frontend/__init__.py +0 -0
  374. {squad-1.95 → squad-1.96.1}/squad/frontend/__main__.py +0 -0
  375. {squad-1.95 → squad-1.96.1}/squad/frontend/admin.py +0 -0
  376. {squad-1.95 → squad-1.96.1}/squad/frontend/apps.py +0 -0
  377. {squad-1.95 → squad-1.96.1}/squad/frontend/badges.py +0 -0
  378. {squad-1.95 → squad-1.96.1}/squad/frontend/build_settings.py +0 -0
  379. {squad-1.95 → squad-1.96.1}/squad/frontend/ci.py +0 -0
  380. {squad-1.95 → squad-1.96.1}/squad/frontend/comparison.py +0 -0
  381. {squad-1.95 → squad-1.96.1}/squad/frontend/extract.py +0 -0
  382. {squad-1.95 → squad-1.96.1}/squad/frontend/forms.py +0 -0
  383. {squad-1.95 → squad-1.96.1}/squad/frontend/group_settings.py +0 -0
  384. {squad-1.95 → squad-1.96.1}/squad/frontend/locale/django.pot +0 -0
  385. {squad-1.95 → squad-1.96.1}/squad/frontend/locale/pl/LC_MESSAGES/django.po +0 -0
  386. {squad-1.95 → squad-1.96.1}/squad/frontend/locale/pt/LC_MESSAGES/django.po +0 -0
  387. {squad-1.95 → squad-1.96.1}/squad/frontend/locale/pt_BR/LC_MESSAGES/django.po +0 -0
  388. {squad-1.95 → squad-1.96.1}/squad/frontend/management/__init__.py +0 -0
  389. {squad-1.95 → squad-1.96.1}/squad/frontend/management/commands/__init__.py +0 -0
  390. {squad-1.95 → squad-1.96.1}/squad/frontend/management/commands/get_token.py +0 -0
  391. {squad-1.95 → squad-1.96.1}/squad/frontend/metrics.py +0 -0
  392. {squad-1.95 → squad-1.96.1}/squad/frontend/project_settings.py +0 -0
  393. {squad-1.95 → squad-1.96.1}/squad/frontend/queries.py +0 -0
  394. {squad-1.95 → squad-1.96.1}/squad/frontend/setup.py +0 -0
  395. {squad-1.95 → squad-1.96.1}/squad/frontend/static/compare.css +0 -0
  396. {squad-1.95 → squad-1.96.1}/squad/frontend/static/download +0 -0
  397. {squad-1.95 → squad-1.96.1}/squad/frontend/static/download.conf +0 -0
  398. {squad-1.95 → squad-1.96.1}/squad/frontend/static/favicon.ico +0 -0
  399. {squad-1.95 → squad-1.96.1}/squad/frontend/static/main.css +0 -0
  400. {squad-1.95 → squad-1.96.1}/squad/frontend/static/squad/attach_select2.js +0 -0
  401. {squad-1.95 → squad-1.96.1}/squad/frontend/static/squad/build.js +0 -0
  402. {squad-1.95 → squad-1.96.1}/squad/frontend/static/squad/build_compare.js +0 -0
  403. {squad-1.95 → squad-1.96.1}/squad/frontend/static/squad/build_list.js +0 -0
  404. {squad-1.95 → squad-1.96.1}/squad/frontend/static/squad/charts.js +0 -0
  405. {squad-1.95 → squad-1.96.1}/squad/frontend/static/squad/common.js +0 -0
  406. {squad-1.95 → squad-1.96.1}/squad/frontend/static/squad/compare.js +0 -0
  407. {squad-1.95 → squad-1.96.1}/squad/frontend/static/squad/config.js +0 -0
  408. {squad-1.95 → squad-1.96.1}/squad/frontend/static/squad/controllers/annotation.js +0 -0
  409. {squad-1.95 → squad-1.96.1}/squad/frontend/static/squad/controllers/build_compare.js +0 -0
  410. {squad-1.95 → squad-1.96.1}/squad/frontend/static/squad/controllers/build_list_compare.js +0 -0
  411. {squad-1.95 → squad-1.96.1}/squad/frontend/static/squad/controllers/build_release.js +0 -0
  412. {squad-1.95 → squad-1.96.1}/squad/frontend/static/squad/controllers/cancel.js +0 -0
  413. {squad-1.95 → squad-1.96.1}/squad/frontend/static/squad/controllers/charts.js +0 -0
  414. {squad-1.95 → squad-1.96.1}/squad/frontend/static/squad/controllers/compare.js +0 -0
  415. {squad-1.95 → squad-1.96.1}/squad/frontend/static/squad/controllers/fetch.js +0 -0
  416. {squad-1.95 → squad-1.96.1}/squad/frontend/static/squad/controllers/filter.js +0 -0
  417. {squad-1.95 → squad-1.96.1}/squad/frontend/static/squad/controllers/metricThreshold.js +0 -0
  418. {squad-1.95 → squad-1.96.1}/squad/frontend/static/squad/controllers/project_compare.js +0 -0
  419. {squad-1.95 → squad-1.96.1}/squad/frontend/static/squad/controllers/resubmit.js +0 -0
  420. {squad-1.95 → squad-1.96.1}/squad/frontend/static/squad/controllers/testjobs_progress.js +0 -0
  421. {squad-1.95 → squad-1.96.1}/squad/frontend/static/squad/metric.threshold.js +0 -0
  422. {squad-1.95 → squad-1.96.1}/squad/frontend/static/squad/project_compare.js +0 -0
  423. {squad-1.95 → squad-1.96.1}/squad/frontend/static/squad/showHide.js +0 -0
  424. {squad-1.95 → squad-1.96.1}/squad/frontend/static/squad/table.js +0 -0
  425. {squad-1.95 → squad-1.96.1}/squad/frontend/static/squad_sign.svg +0 -0
  426. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/401.jinja2 +0 -0
  427. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/404.jinja2 +0 -0
  428. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/django/rest_framework/api.html +0 -0
  429. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/django/squad/_user_menu.html +0 -0
  430. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/_builds_table.jinja2 +0 -0
  431. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/_env_suite_data.jinja2 +0 -0
  432. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/_metadata.jinja2 +0 -0
  433. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/_pagination.jinja2 +0 -0
  434. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/_permissions.jinja2 +0 -0
  435. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/_project_list.jinja2 +0 -0
  436. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/_regressions_and_fixes.jinja2 +0 -0
  437. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/_results_table.jinja2 +0 -0
  438. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/_results_transitions_filter.jinja2 +0 -0
  439. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/_subscribe.jinja2 +0 -0
  440. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/_test_results_envbox.jinja2 +0 -0
  441. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/_test_results_suitebox.jinja2 +0 -0
  442. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/_test_results_summary.jinja2 +0 -0
  443. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/_test_results_table.jinja2 +0 -0
  444. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/_test_run_metric.jinja2 +0 -0
  445. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/_test_run_test.jinja2 +0 -0
  446. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/_unfinished_build.jinja2 +0 -0
  447. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/_user_menu.jinja2 +0 -0
  448. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/base.jinja2 +0 -0
  449. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/build-nav.jinja2 +0 -0
  450. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/build.jinja2 +0 -0
  451. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/build_callbacks.jinja2 +0 -0
  452. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/build_metadata.jinja2 +0 -0
  453. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/build_metrics.jinja2 +0 -0
  454. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/build_settings.jinja2 +0 -0
  455. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/builds.jinja2 +0 -0
  456. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/compare.jinja2 +0 -0
  457. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/compare_builds.jinja2 +0 -0
  458. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/compare_projects.jinja2 +0 -0
  459. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/group-nav.jinja2 +0 -0
  460. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/group.jinja2 +0 -0
  461. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/group_settings/advanced.jinja2 +0 -0
  462. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/group_settings/base.jinja2 +0 -0
  463. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/group_settings/delete.jinja2 +0 -0
  464. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/group_settings/index.jinja2 +0 -0
  465. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/group_settings/members.jinja2 +0 -0
  466. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/group_settings/new_group.jinja2 +0 -0
  467. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/group_settings/new_project.jinja2 +0 -0
  468. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/index.jinja2 +0 -0
  469. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/knownissues.jinja2 +0 -0
  470. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/login.jinja2 +0 -0
  471. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/metrics.jinja2 +0 -0
  472. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/project-nav.jinja2 +0 -0
  473. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/project.jinja2 +0 -0
  474. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/project_settings/_threshold_table.jinja2 +0 -0
  475. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/project_settings/advanced.jinja2 +0 -0
  476. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/project_settings/base.jinja2 +0 -0
  477. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/project_settings/build_confidence.jinja2 +0 -0
  478. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/project_settings/delete.jinja2 +0 -0
  479. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/project_settings/environments.jinja2 +0 -0
  480. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/project_settings/index.jinja2 +0 -0
  481. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/project_settings/thresholds.jinja2 +0 -0
  482. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/test_history.jinja2 +0 -0
  483. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/test_run.jinja2 +0 -0
  484. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/test_run_suite_metrics.jinja2 +0 -0
  485. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/test_run_suite_test_details.jinja2 +0 -0
  486. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/test_run_suite_tests.jinja2 +0 -0
  487. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/testjob.jinja2 +0 -0
  488. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/testjobs.jinja2 +0 -0
  489. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/testjobs_progress.jinja2 +0 -0
  490. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/tests-details-nav.jinja2 +0 -0
  491. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/tests.jinja2 +0 -0
  492. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/user_settings/api_token.jinja2 +0 -0
  493. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/user_settings/base.jinja2 +0 -0
  494. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/user_settings/profile.jinja2 +0 -0
  495. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/user_settings/projects.jinja2 +0 -0
  496. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/user_settings/subscriptions.jinja2 +0 -0
  497. {squad-1.95 → squad-1.96.1}/squad/frontend/templates/squad/user_settings/user_preferences.jinja2 +0 -0
  498. {squad-1.95 → squad-1.96.1}/squad/frontend/templatetags/__init__.py +0 -0
  499. {squad-1.95 → squad-1.96.1}/squad/frontend/templatetags/squad.py +0 -0
  500. {squad-1.95 → squad-1.96.1}/squad/frontend/tests.py +0 -0
  501. {squad-1.95 → squad-1.96.1}/squad/frontend/urls.py +0 -0
  502. {squad-1.95 → squad-1.96.1}/squad/frontend/user_settings.py +0 -0
  503. {squad-1.95 → squad-1.96.1}/squad/frontend/utils.py +0 -0
  504. {squad-1.95 → squad-1.96.1}/squad/frontend/views.py +0 -0
  505. {squad-1.95 → squad-1.96.1}/squad/http.py +0 -0
  506. {squad-1.95 → squad-1.96.1}/squad/mail.py +0 -0
  507. {squad-1.95 → squad-1.96.1}/squad/manage.py +0 -0
  508. {squad-1.95 → squad-1.96.1}/squad/plugins/__init__.py +0 -0
  509. {squad-1.95 → squad-1.96.1}/squad/plugins/example.py +0 -0
  510. {squad-1.95 → squad-1.96.1}/squad/plugins/gerrit.py +0 -0
  511. {squad-1.95 → squad-1.96.1}/squad/plugins/github.py +0 -0
  512. {squad-1.95 → squad-1.96.1}/squad/plugins/lib/__init__.py +0 -0
  513. {squad-1.95 → squad-1.96.1}/squad/plugins/lib/base_log_parser.py +0 -0
  514. {squad-1.95 → squad-1.96.1}/squad/plugins/linux_log_parser.py +0 -0
  515. {squad-1.95 → squad-1.96.1}/squad/plugins/linux_log_parser_build.py +0 -0
  516. {squad-1.95 → squad-1.96.1}/squad/run/__init__.py +0 -0
  517. {squad-1.95 → squad-1.96.1}/squad/run/__main__.py +0 -0
  518. {squad-1.95 → squad-1.96.1}/squad/run/listener.py +0 -0
  519. {squad-1.95 → squad-1.96.1}/squad/run/scheduler.py +0 -0
  520. {squad-1.95 → squad-1.96.1}/squad/run/worker.py +0 -0
  521. {squad-1.95 → squad-1.96.1}/squad/settings.py +0 -0
  522. {squad-1.95 → squad-1.96.1}/squad/socialaccount.py +0 -0
  523. {squad-1.95 → squad-1.96.1}/squad/urls.py +0 -0
  524. {squad-1.95 → squad-1.96.1}/squad/wsgi.py +0 -0
  525. {squad-1.95 → squad-1.96.1}/squad.egg-info/dependency_links.txt +0 -0
  526. {squad-1.95 → squad-1.96.1}/squad.egg-info/entry_points.txt +0 -0
  527. {squad-1.95 → squad-1.96.1}/squad.egg-info/top_level.txt +0 -0
  528. {squad-1.95 → squad-1.96.1}/squad.svg +0 -0
  529. {squad-1.95 → squad-1.96.1}/test/__init__.py +0 -0
  530. {squad-1.95 → squad-1.96.1}/test/api/__init__.py +0 -0
  531. {squad-1.95 → squad-1.96.1}/test/api/benchmarks.csv +0 -0
  532. {squad-1.95 → squad-1.96.1}/test/api/benchmarks.json +0 -0
  533. {squad-1.95 → squad-1.96.1}/test/api/definition.yaml +0 -0
  534. {squad-1.95 → squad-1.96.1}/test/api/metadata.json +0 -0
  535. {squad-1.95 → squad-1.96.1}/test/api/test_ci.py +0 -0
  536. {squad-1.95 → squad-1.96.1}/test/api/test_data.py +0 -0
  537. {squad-1.95 → squad-1.96.1}/test/api/test_rest.py +0 -0
  538. {squad-1.95 → squad-1.96.1}/test/api/test_run.log +0 -0
  539. {squad-1.95 → squad-1.96.1}/test/api/tests.csv +0 -0
  540. {squad-1.95 → squad-1.96.1}/test/api/tests.json +0 -0
  541. {squad-1.95 → squad-1.96.1}/test/api/tests.py +0 -0
  542. {squad-1.95 → squad-1.96.1}/test/api/tests_log.json +0 -0
  543. {squad-1.95 → squad-1.96.1}/test/api/tests_two.json +0 -0
  544. {squad-1.95 → squad-1.96.1}/test/api/twoline_definition.yaml +0 -0
  545. {squad-1.95 → squad-1.96.1}/test/ci/__init__.py +0 -0
  546. {squad-1.95 → squad-1.96.1}/test/ci/backend/__init__.py +0 -0
  547. {squad-1.95 → squad-1.96.1}/test/ci/backend/example-broken-log.yaml +0 -0
  548. {squad-1.95 → squad-1.96.1}/test/ci/backend/example-lava-log.yaml +0 -0
  549. {squad-1.95 → squad-1.96.1}/test/ci/backend/lava.json +0 -0
  550. {squad-1.95 → squad-1.96.1}/test/ci/backend/test_fake.py +0 -0
  551. {squad-1.95 → squad-1.96.1}/test/ci/backend/test_lava.py +0 -0
  552. {squad-1.95 → squad-1.96.1}/test/ci/backend/test_real_lava.py +0 -0
  553. {squad-1.95 → squad-1.96.1}/test/ci/backend/tuxsuite_test_failed_result_sample.json +0 -0
  554. {squad-1.95 → squad-1.96.1}/test/ci/test_listen.py +0 -0
  555. {squad-1.95 → squad-1.96.1}/test/ci/test_models.py +0 -0
  556. {squad-1.95 → squad-1.96.1}/test/ci/test_tasks.py +0 -0
  557. {squad-1.95 → squad-1.96.1}/test/core/__init__.py +0 -0
  558. {squad-1.95 → squad-1.96.1}/test/core/test_attachment.py +0 -0
  559. {squad-1.95 → squad-1.96.1}/test/core/test_build_summary.py +0 -0
  560. {squad-1.95 → squad-1.96.1}/test/core/test_callback.py +0 -0
  561. {squad-1.95 → squad-1.96.1}/test/core/test_emailtemplate.py +0 -0
  562. {squad-1.95 → squad-1.96.1}/test/core/test_failures.py +0 -0
  563. {squad-1.95 → squad-1.96.1}/test/core/test_group.py +0 -0
  564. {squad-1.95 → squad-1.96.1}/test/core/test_historical_emailtemplate.py +0 -0
  565. {squad-1.95 → squad-1.96.1}/test/core/test_history.py +0 -0
  566. {squad-1.95 → squad-1.96.1}/test/core/test_import_data.py +0 -0
  567. {squad-1.95 → squad-1.96.1}/test/core/test_import_data_input/1/default/1/metadata.json +0 -0
  568. {squad-1.95 → squad-1.96.1}/test/core/test_import_data_input/1/default/1/metrics.json +0 -0
  569. {squad-1.95 → squad-1.96.1}/test/core/test_import_data_input/2/default/2/metadata.json +0 -0
  570. {squad-1.95 → squad-1.96.1}/test/core/test_import_data_input/2/default/2/metrics.json +0 -0
  571. {squad-1.95 → squad-1.96.1}/test/core/test_import_data_input/2/default/2/screenshot.png +0 -0
  572. {squad-1.95 → squad-1.96.1}/test/core/test_import_data_input/2/default/2/tests.json +0 -0
  573. {squad-1.95 → squad-1.96.1}/test/core/test_import_data_missing_metadata/1/1/tests.json +0 -0
  574. {squad-1.95 → squad-1.96.1}/test/core/test_known_issues.py +0 -0
  575. {squad-1.95 → squad-1.96.1}/test/core/test_metric.py +0 -0
  576. {squad-1.95 → squad-1.96.1}/test/core/test_metric_comparison.py +0 -0
  577. {squad-1.95 → squad-1.96.1}/test/core/test_metric_threshold.py +0 -0
  578. {squad-1.95 → squad-1.96.1}/test/core/test_metrics_data.py +0 -0
  579. {squad-1.95 → squad-1.96.1}/test/core/test_metrics_summary.py +0 -0
  580. {squad-1.95 → squad-1.96.1}/test/core/test_notification.py +0 -0
  581. {squad-1.95 → squad-1.96.1}/test/core/test_notification_delivery.py +0 -0
  582. {squad-1.95 → squad-1.96.1}/test/core/test_patch_source.py +0 -0
  583. {squad-1.95 → squad-1.96.1}/test/core/test_project.py +0 -0
  584. {squad-1.95 → squad-1.96.1}/test/core/test_project_status.py +0 -0
  585. {squad-1.95 → squad-1.96.1}/test/core/test_statistics.py +0 -0
  586. {squad-1.95 → squad-1.96.1}/test/core/test_tasks.py +0 -0
  587. {squad-1.95 → squad-1.96.1}/test/core/test_tasks_notification.py +0 -0
  588. {squad-1.95 → squad-1.96.1}/test/core/test_test.py +0 -0
  589. {squad-1.95 → squad-1.96.1}/test/core/test_test_comparison.py +0 -0
  590. {squad-1.95 → squad-1.96.1}/test/core/test_test_data.py +0 -0
  591. {squad-1.95 → squad-1.96.1}/test/core/test_test_run.py +0 -0
  592. {squad-1.95 → squad-1.96.1}/test/core/test_test_summary.py +0 -0
  593. {squad-1.95 → squad-1.96.1}/test/core/test_update_project_statuses.py +0 -0
  594. {squad-1.95 → squad-1.96.1}/test/core/test_user_namespace.py +0 -0
  595. {squad-1.95 → squad-1.96.1}/test/core/test_utils.py +0 -0
  596. {squad-1.95 → squad-1.96.1}/test/frontend/__init__.py +0 -0
  597. {squad-1.95 → squad-1.96.1}/test/frontend/test_basics.py +0 -0
  598. {squad-1.95 → squad-1.96.1}/test/frontend/test_comparison.py +0 -0
  599. {squad-1.95 → squad-1.96.1}/test/frontend/test_get_token_command.py +0 -0
  600. {squad-1.95 → squad-1.96.1}/test/frontend/test_group_settings.py +0 -0
  601. {squad-1.95 → squad-1.96.1}/test/frontend/test_history.py +0 -0
  602. {squad-1.95 → squad-1.96.1}/test/frontend/test_template_tags.py +0 -0
  603. {squad-1.95 → squad-1.96.1}/test/frontend/test_test_job.py +0 -0
  604. {squad-1.95 → squad-1.96.1}/test/frontend/test_tests.py +0 -0
  605. {squad-1.95 → squad-1.96.1}/test/frontend/test_utils.py +0 -0
  606. {squad-1.95 → squad-1.96.1}/test/integration/__init__.py +0 -0
  607. {squad-1.95 → squad-1.96.1}/test/integration/test_build_notification_from_ci.py +0 -0
  608. {squad-1.95 → squad-1.96.1}/test/javascript.py +0 -0
  609. {squad-1.95 → squad-1.96.1}/test/karma.conf.js +0 -0
  610. {squad-1.95 → squad-1.96.1}/test/mock.py +0 -0
  611. {squad-1.95 → squad-1.96.1}/test/performance.py +0 -0
  612. {squad-1.95 → squad-1.96.1}/test/plugins/__init__.py +0 -0
  613. {squad-1.95 → squad-1.96.1}/test/plugins/linux_log_parser/different-numbers-in-function-name-oops.log +0 -0
  614. {squad-1.95 → squad-1.96.1}/test/plugins/linux_log_parser/duplicated-oops.log +0 -0
  615. {squad-1.95 → squad-1.96.1}/test/plugins/linux_log_parser/internal-error-oops.log +0 -0
  616. {squad-1.95 → squad-1.96.1}/test/plugins/linux_log_parser/kasan.log +0 -0
  617. {squad-1.95 → squad-1.96.1}/test/plugins/linux_log_parser/kcsan_full_log.log +0 -0
  618. {squad-1.95 → squad-1.96.1}/test/plugins/linux_log_parser/kcsan_simple.log +0 -0
  619. {squad-1.95 → squad-1.96.1}/test/plugins/linux_log_parser/kernel_bug_and_invalid_opcode.log +0 -0
  620. {squad-1.95 → squad-1.96.1}/test/plugins/linux_log_parser/kernelexceptiontrace.log +0 -0
  621. {squad-1.95 → squad-1.96.1}/test/plugins/linux_log_parser/kernelexceptiontrace_without_squarebraces.log +0 -0
  622. {squad-1.95 → squad-1.96.1}/test/plugins/linux_log_parser/kernelpanic-multiline.log +0 -0
  623. {squad-1.95 → squad-1.96.1}/test/plugins/linux_log_parser/kernelpanic-single-and-multiline.log +0 -0
  624. {squad-1.95 → squad-1.96.1}/test/plugins/linux_log_parser/kfence.log +0 -0
  625. {squad-1.95 → squad-1.96.1}/test/plugins/linux_log_parser/multiple_issues_dmesg.log +0 -0
  626. {squad-1.95 → squad-1.96.1}/test/plugins/linux_log_parser/oops.log +0 -0
  627. {squad-1.95 → squad-1.96.1}/test/plugins/linux_log_parser/rcu_warning.log +0 -0
  628. {squad-1.95 → squad-1.96.1}/test/plugins/linux_log_parser_build/clang_arm64_25103120.log +0 -0
  629. {squad-1.95 → squad-1.96.1}/test/plugins/linux_log_parser_build/clang_arm64_2957859.log +0 -0
  630. {squad-1.95 → squad-1.96.1}/test/plugins/linux_log_parser_build/clang_arm_24958120.log +0 -0
  631. {squad-1.95 → squad-1.96.1}/test/plugins/linux_log_parser_build/clang_arm_26001178.log +0 -0
  632. {squad-1.95 → squad-1.96.1}/test/plugins/linux_log_parser_build/clang_i386_25043392.log +0 -0
  633. {squad-1.95 → squad-1.96.1}/test/plugins/linux_log_parser_build/clang_i386_25431539.log +0 -0
  634. {squad-1.95 → squad-1.96.1}/test/plugins/linux_log_parser_build/clang_riscv_24688299.log +0 -0
  635. {squad-1.95 → squad-1.96.1}/test/plugins/linux_log_parser_build/clang_x86_64_25086964.log +0 -0
  636. {squad-1.95 → squad-1.96.1}/test/plugins/linux_log_parser_build/clang_x86_64_26103794.log +0 -0
  637. {squad-1.95 → squad-1.96.1}/test/plugins/linux_log_parser_build/gcc_arm64_24934206.log +0 -0
  638. {squad-1.95 → squad-1.96.1}/test/plugins/linux_log_parser_build/gcc_arm_24951924.log +0 -0
  639. {squad-1.95 → squad-1.96.1}/test/plugins/linux_log_parser_build/gcc_arm_25044425.log +0 -0
  640. {squad-1.95 → squad-1.96.1}/test/plugins/linux_log_parser_build/gcc_arm_25078650.log +0 -0
  641. {squad-1.95 → squad-1.96.1}/test/plugins/linux_log_parser_build/gcc_i386_25044475.log +0 -0
  642. {squad-1.95 → squad-1.96.1}/test/plugins/linux_log_parser_build/gcc_riscv_24715191.log +0 -0
  643. {squad-1.95 → squad-1.96.1}/test/plugins/linux_log_parser_build/gcc_s390_26103313.log +0 -0
  644. {squad-1.95 → squad-1.96.1}/test/plugins/linux_log_parser_build/gcc_sh_26103296.log +0 -0
  645. {squad-1.95 → squad-1.96.1}/test/plugins/linux_log_parser_build/gcc_x86_64_24932905.log +0 -0
  646. {squad-1.95 → squad-1.96.1}/test/plugins/linux_log_parser_build/gcc_x86_64_26103833.log +0 -0
  647. {squad-1.95 → squad-1.96.1}/test/plugins/linux_log_parser_build/gcc_x86_64_26788931.log +0 -0
  648. {squad-1.95 → squad-1.96.1}/test/plugins/linux_log_parser_build/gcc_x86_64_26861563.log +0 -0
  649. {squad-1.95 → squad-1.96.1}/test/plugins/log_parser_base/kfence-seconds-expected.log +0 -0
  650. {squad-1.95 → squad-1.96.1}/test/plugins/log_parser_base/kfence-seconds.log +0 -0
  651. {squad-1.95 → squad-1.96.1}/test/plugins/test_gerrit.py +0 -0
  652. {squad-1.95 → squad-1.96.1}/test/plugins/test_github.py +0 -0
  653. {squad-1.95 → squad-1.96.1}/test/plugins/test_linux_log_parser.py +0 -0
  654. {squad-1.95 → squad-1.96.1}/test/plugins/test_linux_log_parser_build.py +0 -0
  655. {squad-1.95 → squad-1.96.1}/test/plugins/test_log_parser_base.py +0 -0
  656. {squad-1.95 → squad-1.96.1}/test/plugins/test_plugin.py +0 -0
  657. {squad-1.95 → squad-1.96.1}/test/settings.py +0 -0
  658. {squad-1.95 → squad-1.96.1}/test/test_architecture.py +0 -0
  659. {squad-1.95 → squad-1.96.1}/test/test_code_quality.py +0 -0
  660. {squad-1.95 → squad-1.96.1}/test/test_cors.py +0 -0
  661. {squad-1.95 → squad-1.96.1}/test/test_i18n.py +0 -0
  662. {squad-1.95 → squad-1.96.1}/test/test_mail.py +0 -0
  663. {squad-1.95 → squad-1.96.1}/test/test_pending_migrations.py +0 -0
  664. {squad-1.95 → squad-1.96.1}/test/unit/test_annotation.js +0 -0
  665. {squad-1.95 → squad-1.96.1}/test/unit/test_cancel.js +0 -0
  666. {squad-1.95 → squad-1.96.1}/test/unit/test_charts.js +0 -0
  667. {squad-1.95 → squad-1.96.1}/test/unit/test_compare.js +0 -0
  668. {squad-1.95 → squad-1.96.1}/test/unit/test_filter.js +0 -0
  669. {squad-1.95 → squad-1.96.1}/test/unit/test_resubmit.js +0 -0
@@ -1,3 +1,13 @@
1
+ # 1.96.1
2
+
3
+ This release fixes small bugs in the previous release regarding picking up log snippets
4
+ from Tuxsuite jobs.
5
+
6
+ # 1.96
7
+
8
+ This release takes in LAVA logs in Tuxsuite.
9
+ The release also fixes a long-running query by reusing pre-calculated suite statuses.
10
+
1
11
  # 1.95
2
12
 
3
13
  This release collects log snippets for Tuxsuite backend.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: squad
3
- Version: 1.95
3
+ Version: 1.96.1
4
4
  Summary: Software Quality Dashboard
5
5
  Home-page: https://gitlab.com/Linaro/squad/squad
6
6
  Author: Antonio Terceiro
@@ -11,7 +11,6 @@ License-File: COPYING
11
11
  Requires-Dist: aiohttp
12
12
  Requires-Dist: celery
13
13
  Requires-Dist: cryptography
14
- Requires-Dist: coreapi
15
14
  Requires-Dist: django_crispy_forms==1.14.0
16
15
  Requires-Dist: Django<5,>=3
17
16
  Requires-Dist: django-allauth
@@ -419,7 +419,7 @@ built and it's available at /api/schema URL. Example usage with coreapi-cli:
419
419
  More details about coreapi can be found on coreapi website and DRF website:
420
420
 
421
421
  * http://www.coreapi.org/
422
- * https://www.django-rest-framework.org/topics/api-clients/
422
+ * https://www.django-rest-framework.org/community/mozilla-grant/#client-libraries
423
423
 
424
424
  SQUAD-Client
425
425
  -------------------------
@@ -9,4 +9,3 @@ pytest
9
9
  pytest-django
10
10
  pytest-cov
11
11
  requests-mock
12
- squad-linaro-plugins
@@ -1,7 +1,6 @@
1
1
  aiohttp
2
2
  celery
3
3
  cryptography
4
- coreapi
5
4
  django_crispy_forms==1.14.0
6
5
  Django<5,>=3
7
6
  django-allauth
@@ -392,9 +392,12 @@ class Backend(BaseBackend):
392
392
  if 'unknown' == results['results']['boot']:
393
393
  return None
394
394
 
395
- # Retrieve TuxRun log
395
+ # Retrieve plain text log
396
396
  logs = self.fetch_url(job_url + '/', 'logs?format=txt').text
397
- log_lines = logs.splitlines()
397
+
398
+ # Retrieve YAML log
399
+ log_structured = self.fetch_url(results["download_url"], 'lava-logs.yaml').text
400
+ log_data = yaml.safe_load(log_structured)
398
401
 
399
402
  attachment_list = ["reproducer", "tux_plan.yaml"]
400
403
  attachments = {}
@@ -410,26 +413,44 @@ class Backend(BaseBackend):
410
413
  boot_test_name = 'boot/' + (metadata.get('build_name') or 'boot')
411
414
  tests[boot_test_name] = {'result': results['results']['boot']}
412
415
 
416
+ lava_signal = re.compile("^<LAVA_SIGNAL_")
417
+
418
+ def filter_log(line):
419
+ return type(line["msg"]) is str \
420
+ and line["lvl"] == "target" \
421
+ and not lava_signal.match(line["msg"])
422
+
413
423
  # Really fetch test results
414
424
  tests_results = self.fetch_url(job_url + '/', 'results').json()
415
425
  if tests_results.get('error', None) is None:
416
426
  for suite, suite_tests in tests_results.items():
417
- if suite == 'lava':
418
- continue
419
-
420
427
  suite_name = re.sub(r'^[0-9]+_', '', suite)
421
428
  for name, test_data in suite_tests.items():
422
429
  test_name = f'{suite_name}/{name}'
423
- result = test_data['result']
430
+ result = test_data.get('result')
431
+ if not result:
432
+ continue
424
433
  if "starttc" in test_data:
425
- starttc = test_data["starttc"] - 1 # LAVA data counts from 1, we count from 0
434
+ try:
435
+ # LAVA data counts from 1, we count from 0
436
+ starttc = int(test_data["starttc"]) - 1
437
+ except ValueError:
438
+ continue
426
439
  if "endtc" in test_data:
427
- # no -1 as the second index of the slice needs to be
428
- # greater than the first to get at least one item.
429
- endtc = test_data["endtc"]
440
+ try:
441
+ # no -1 as the second index of the slice needs to be
442
+ # greater than the first to get at least one item.
443
+ endtc = int(test_data["endtc"])
444
+ except ValueError:
445
+ endtc = starttc + 2
430
446
  else:
431
447
  endtc = starttc + 2
432
- log_snippet = "\n".join(log_lines[starttc:endtc])
448
+ log_lines = [
449
+ line["msg"].replace("\x00", "")
450
+ for line in log_data[starttc:endtc]
451
+ if filter_log(line)
452
+ ]
453
+ log_snippet = "\n".join(log_lines)
433
454
  else:
434
455
  log_snippet = None
435
456
  tests[test_name] = {"result": result, "log": log_snippet}
@@ -31,17 +31,24 @@ class Command(BaseCommand):
31
31
  type=str,
32
32
  help='Project to fetch the data into (Format: foo/bar)',
33
33
  )
34
+ parser.add_argument(
35
+ 'BUILD',
36
+ type=str,
37
+ nargs="?",
38
+ help='Build to fetch the data into',
39
+ )
34
40
 
35
41
  def handle(self, *args, **options):
36
42
  backend_name = options.get("BACKEND")
37
43
  job_id = options.get("JOBID")
38
44
  group_slug, project_slug = options.get("PROJECT").split('/')
45
+ _build = options.get("BUILD") or str(time.time())
39
46
 
40
47
  backend = Backend.objects.get(name=backend_name)
41
48
 
42
49
  group, _ = Group.objects.get_or_create(slug=group_slug)
43
50
  project, _ = group.projects.get_or_create(slug=project_slug)
44
- build = project.builds.create(version=str(time.time()))
51
+ build, _ = project.builds.get_or_create(version=_build)
45
52
 
46
53
  testjob = backend.test_jobs.create(target=project, job_id=job_id, target_build=build)
47
54
 
@@ -1,7 +1,7 @@
1
1
  import json
2
2
  import yaml
3
3
  import logging
4
- from collections import OrderedDict, Counter
4
+ from collections import Counter, defaultdict
5
5
  from hashlib import sha1
6
6
  from itertools import groupby
7
7
  import re
@@ -676,36 +676,62 @@ class Build(models.Model):
676
676
 
677
677
  @property
678
678
  def test_suites_by_environment(self):
679
- test_runs = self.test_runs.prefetch_related(
680
- 'tests',
681
- 'tests__suite',
682
- 'environment',
679
+ """
680
+ Return a sorted dictionary like
681
+ {
682
+ "env1": [
683
+ ("suite1", {"fail": 0, "pass": 0, "skip": 0, "xfail": 0}),
684
+ ("suite2", {"fail": 0, "pass": 0, "skip": 0, "xfail": 0}),
685
+ ...
686
+ ],
687
+ "env2": [
688
+ ("suite1", {"fail": 0, "pass": 0, "skip": 0, "xfail": 0}),
689
+ ("suite2", {"fail": 0, "pass": 0, "skip": 0, "xfail": 0}),
690
+ ...
691
+ ],
692
+ ...
693
+ }
694
+
695
+ Sorted by env slug, and then by suite slug
696
+ """
697
+
698
+ tmp_results = defaultdict(
699
+ lambda: defaultdict(
700
+ lambda: {
701
+ "fail": 0,
702
+ "pass": 0,
703
+ "skip": 0,
704
+ "xfail": 0,
705
+ }
706
+ )
683
707
  )
684
- template = OrderedDict((
685
- ('fail', 0),
686
- ('pass', 0),
687
- ('skip', 0),
688
- ('xfail', 0),
689
- ))
690
- result = OrderedDict()
691
- envlist = set([t.environment for t in test_runs])
692
- for env in sorted(envlist, key=lambda env: env.slug):
693
- result[env] = dict()
694
- for tr in test_runs:
695
- for t in tr.tests.all():
696
- if t.suite in result[tr.environment].keys():
697
- result[tr.environment][t.suite][t.status] += 1
698
- else:
699
- if t.suite not in result[tr.environment]:
700
- result[tr.environment][t.suite] = template.copy()
701
- result[tr.environment][t.suite][t.status] += 1
702
- for env in result.keys():
703
- # there should only be one key in the most nested dict
704
- result[env] = sorted(
705
- result[env].items(),
706
- key=lambda suite_dict: suite_dict[0].slug)
707
-
708
- return result
708
+
709
+ statuses = Status.objects.filter(
710
+ test_run__build=self,
711
+ suite__isnull=False
712
+ ).prefetch_related(
713
+ 'test_run__environment',
714
+ 'suite',
715
+ ).order_by(
716
+ 'test_run__environment__slug',
717
+ 'suite__slug',
718
+ )
719
+
720
+ for status in statuses:
721
+ env = status.test_run.environment
722
+ suite = status.suite
723
+
724
+ tmp_results[env][suite]['fail'] += status.tests_fail
725
+ tmp_results[env][suite]['pass'] += status.tests_pass
726
+ tmp_results[env][suite]['skip'] += status.tests_skip
727
+ tmp_results[env][suite]['xfail'] += status.tests_xfail
728
+
729
+ results = defaultdict(list)
730
+ for env, suites in tmp_results.items():
731
+ for suite, status in suites.items():
732
+ results[env].append((suite, status))
733
+
734
+ return results
709
735
 
710
736
  def test_jobs_summary(self, per_environment=False):
711
737
  testjobs = self.test_jobs.only('environment', 'job_status', 'target_build').order_by('environment')
@@ -69,7 +69,7 @@ def _register(attr, fn=None, name=None, takes_context=None):
69
69
 
70
70
 
71
71
  def _update_local_env(attr, func, name=None, takes_context=None):
72
- global _local_env
72
+ global _local_env # noqa
73
73
 
74
74
  if takes_context:
75
75
  func.contextfunction = True
@@ -0,0 +1 @@
1
+ __version__ = '1.96.1'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: squad
3
- Version: 1.95
3
+ Version: 1.96.1
4
4
  Summary: Software Quality Dashboard
5
5
  Home-page: https://gitlab.com/Linaro/squad/squad
6
6
  Author: Antonio Terceiro
@@ -11,7 +11,6 @@ License-File: COPYING
11
11
  Requires-Dist: aiohttp
12
12
  Requires-Dist: celery
13
13
  Requires-Dist: cryptography
14
- Requires-Dist: coreapi
15
14
  Requires-Dist: django_crispy_forms==1.14.0
16
15
  Requires-Dist: Django<5,>=3
17
16
  Requires-Dist: django-allauth
@@ -612,8 +612,6 @@ test/frontend/test_tests.py
612
612
  test/frontend/test_utils.py
613
613
  test/integration/__init__.py
614
614
  test/integration/test_build_notification_from_ci.py
615
- test/integration/plugins/test_tradefed.py
616
- test/integration/plugins/tradefed-output-20220608105250.tar.xz
617
615
  test/plugins/__init__.py
618
616
  test/plugins/test_gerrit.py
619
617
  test/plugins/test_github.py
@@ -1,7 +1,6 @@
1
1
  aiohttp
2
2
  celery
3
3
  cryptography
4
- coreapi
5
4
  django_crispy_forms==1.14.0
6
5
  Django<5,>=3
7
6
  django-allauth
@@ -893,6 +893,7 @@ class TuxSuiteTest(TestCase):
893
893
  testjob = self.build.test_jobs.create(target=self.project, backend=self.backend, job_id=job_id)
894
894
  test_url = urljoin(TUXSUITE_URL, '/groups/tuxgroup/projects/tuxproject/tests/123')
895
895
  build_url = urljoin(TUXSUITE_URL, '/groups/tuxgroup/projects/tuxproject/builds/456')
896
+ storage_url = "https://storage.example.com/tuxgroup/tuxproject/123/"
896
897
 
897
898
  # Only fetch when finished
898
899
  with requests_mock.Mocker() as fake_request:
@@ -901,6 +902,7 @@ class TuxSuiteTest(TestCase):
901
902
  self.assertEqual(None, results)
902
903
 
903
904
  test_logs = "\n".join([f"line {i}" for i in range(1, 1000)])
905
+ yaml_logs = "\n".join([f"- {{\"dt\": \"2025-04-09T13:15:59.421673\", \"lvl\": \"target\", \"msg\": \"line {i}\\0\"}}" for i in range(1, 1000)])
904
906
  test_results = {
905
907
  'project': 'tuxgroup/tuxproject',
906
908
  'device': 'qemu-armv7',
@@ -929,7 +931,8 @@ class TuxSuiteTest(TestCase):
929
931
  'finished_time': '2022-03-25T15:52:42.672483',
930
932
  'retries': 0,
931
933
  'retries_messages': [],
932
- 'duration': 151
934
+ 'duration': 151,
935
+ 'download_url': storage_url,
933
936
  }
934
937
  build_results = {
935
938
  'toolchain': 'gcc-10',
@@ -974,12 +977,13 @@ class TuxSuiteTest(TestCase):
974
977
  fake_request.get(test_url, json=test_results)
975
978
  fake_request.get(build_url, json=build_results)
976
979
  fake_request.get(urljoin(test_url + '/', 'logs'), text=test_logs)
980
+ fake_request.get(urljoin(storage_url + '/', 'lava-logs.yaml'), text=yaml_logs)
977
981
  fake_request.get(urljoin(test_url + '/', 'results'), json=test_results_json)
978
982
  fake_request.get(urljoin(test_url + '/', 'reproducer'), text='reproducer contents')
979
983
  fake_request.get(urljoin(test_url + '/', 'tux_plan.yaml'), text='tux_plan.yaml contents')
980
984
 
981
985
  status, completed, metadata, tests, metrics, logs, attachments = self.tuxsuite.fetch(testjob)
982
- tests_results = {k: v["result"] for k, v in tests.items()}
986
+ tests_results = {k: v["result"] for k, v in tests.items() if not k.startswith("lava/")}
983
987
  self.assertEqual('Complete', status)
984
988
  self.assertTrue(completed)
985
989
  self.assertEqual(sorted(expected_metadata.items()), sorted(metadata.items()))
@@ -995,6 +999,7 @@ class TuxSuiteTest(TestCase):
995
999
  testjob = self.build.test_jobs.create(target=self.project, backend=self.backend, job_id=job_id)
996
1000
  test_url = urljoin(TUXSUITE_URL, '/groups/tuxgroup/projects/tuxproject/tests/123')
997
1001
  build_url = urljoin(TUXSUITE_URL, '/groups/tuxgroup/projects/tuxproject/builds/456')
1002
+ storage_url = "https://storage.example.com/tuxgroup/tuxproject/123/"
998
1003
 
999
1004
  # Only fetch when finished
1000
1005
  with requests_mock.Mocker() as fake_request:
@@ -1003,6 +1008,7 @@ class TuxSuiteTest(TestCase):
1003
1008
  self.assertEqual(None, results)
1004
1009
 
1005
1010
  test_logs = 'dummy test log'
1011
+ yaml_logs = '- {"dt": "2025-04-09T13:15:59.421673", "lvl": "info", "msg": "dummy test log"}'
1006
1012
  test_results = {
1007
1013
  'project': 'tuxgroup/tuxproject',
1008
1014
  'device': 'qemu-armv7',
@@ -1032,7 +1038,8 @@ class TuxSuiteTest(TestCase):
1032
1038
  'finished_time': '2022-03-25T15:52:42.672483',
1033
1039
  'retries': 0,
1034
1040
  'retries_messages': [],
1035
- 'duration': 151
1041
+ 'duration': 151,
1042
+ 'download_url': storage_url,
1036
1043
  }
1037
1044
  build_results = {
1038
1045
  'toolchain': 'gcc-10',
@@ -1077,12 +1084,13 @@ class TuxSuiteTest(TestCase):
1077
1084
  fake_request.get(test_url, json=test_results)
1078
1085
  fake_request.get(build_url, json=build_results)
1079
1086
  fake_request.get(urljoin(test_url + '/', 'logs'), text=test_logs)
1087
+ fake_request.get(urljoin(storage_url + '/', 'lava-logs.yaml'), text=yaml_logs)
1080
1088
  fake_request.get(urljoin(test_url + '/', 'results'), json=test_results_json)
1081
1089
  fake_request.get(urljoin(test_url + '/', 'reproducer'), text='reproducer contents')
1082
1090
  fake_request.get(urljoin(test_url + '/', 'tux_plan.yaml'), text='tux_plan.yaml contents')
1083
1091
 
1084
1092
  status, completed, metadata, tests, metrics, logs, attachments = self.tuxsuite.fetch(testjob)
1085
- tests_results = {k: v["result"] for k, v in tests.items()}
1093
+ tests_results = {k: v["result"] for k, v in tests.items() if not k.startswith("lava/")}
1086
1094
  self.assertEqual('Complete', status)
1087
1095
  self.assertTrue(completed)
1088
1096
  self.assertEqual(sorted(expected_metadata.items()), sorted(metadata.items()))
@@ -1097,8 +1105,10 @@ class TuxSuiteTest(TestCase):
1097
1105
  job_id = 'TEST:tuxgroup@tuxproject#1234'
1098
1106
  testjob = self.build.test_jobs.create(target=self.project, backend=self.backend, job_id=job_id)
1099
1107
  test_url = urljoin(TUXSUITE_URL, '/groups/tuxgroup/projects/tuxproject/tests/1234')
1108
+ storage_url = "https://storage.example.com/tuxgroup/tuxproject/123/"
1100
1109
 
1101
1110
  test_logs = 'dummy test log'
1111
+ yaml_logs = '- {"dt": "2025-04-09T13:15:59.421673", "lvl": "info", "msg": "dummy test log"}'
1102
1112
  test_results = {
1103
1113
  'project': 'tuxgroup/tuxproject',
1104
1114
  'device': 'qemu-armv7',
@@ -1127,7 +1137,8 @@ class TuxSuiteTest(TestCase):
1127
1137
  'finished_time': '2022-03-25T15:52:42.672483',
1128
1138
  'retries': 0,
1129
1139
  'retries_messages': [],
1130
- 'duration': 151
1140
+ 'duration': 151,
1141
+ 'download_url': storage_url,
1131
1142
  }
1132
1143
 
1133
1144
  expected_metadata = {
@@ -1163,12 +1174,13 @@ class TuxSuiteTest(TestCase):
1163
1174
  with requests_mock.Mocker() as fake_request:
1164
1175
  fake_request.get(test_url, json=test_results)
1165
1176
  fake_request.get(urljoin(test_url + '/', 'logs'), text=test_logs)
1177
+ fake_request.get(urljoin(storage_url + '/', 'lava-logs.yaml'), text=yaml_logs)
1166
1178
  fake_request.get(urljoin(test_url + '/', 'results'), json=test_results_json)
1167
1179
  fake_request.get(urljoin(test_url + '/', 'reproducer'), text='reproducer contents')
1168
1180
  fake_request.get(urljoin(test_url + '/', 'tux_plan.yaml'), text='tux_plan.yaml contents')
1169
1181
 
1170
1182
  status, completed, metadata, tests, metrics, logs, attachments = self.tuxsuite.fetch(testjob)
1171
- tests_results = {k: v["result"] for k, v in tests.items()}
1183
+ tests_results = {k: v["result"] for k, v in tests.items() if not k.startswith("lava/")}
1172
1184
  self.assertEqual('Complete', status)
1173
1185
  self.assertTrue(completed)
1174
1186
  self.assertEqual(sorted(expected_metadata.items()), sorted(metadata.items()))
@@ -1183,8 +1195,10 @@ class TuxSuiteTest(TestCase):
1183
1195
  testjob = self.build.test_jobs.create(target=self.project, backend=self.backend, job_id=job_id)
1184
1196
  test_url = urljoin(TUXSUITE_URL, '/groups/tuxgroup/projects/tuxproject/tests/123')
1185
1197
  build_url = urljoin(TUXSUITE_URL, '/groups/tuxgroup/projects/tuxproject/builds/456')
1198
+ storage_url = "https://storage.example.com/tuxgroup/tuxproject/123/"
1186
1199
 
1187
1200
  test_logs = 'dummy test log'
1201
+ yaml_logs = '- {"dt": "2025-04-09T13:15:59.421673", "lvl": "info", "msg": "dummy test log"}'
1188
1202
  test_results = {
1189
1203
  'project': 'tuxgroup/tuxproject',
1190
1204
  'device': 'qemu-armv7',
@@ -1213,7 +1227,8 @@ class TuxSuiteTest(TestCase):
1213
1227
  'finished_time': '2022-03-25T15:52:42.672483',
1214
1228
  'retries': 0,
1215
1229
  'retries_messages': [],
1216
- 'duration': 151
1230
+ 'duration': 151,
1231
+ 'download_url': storage_url,
1217
1232
  }
1218
1233
  build_results = {
1219
1234
  'toolchain': 'gcc-10',
@@ -1262,13 +1277,14 @@ class TuxSuiteTest(TestCase):
1262
1277
  with requests_mock.Mocker() as fake_request:
1263
1278
  fake_request.get(build_url, json=build_results)
1264
1279
  fake_request.get(urljoin(test_url + '/', 'logs'), text=test_logs)
1280
+ fake_request.get(urljoin(storage_url + '/', 'lava-logs.yaml'), text=yaml_logs)
1265
1281
  fake_request.get(urljoin(test_url + '/', 'results'), json=test_results_json)
1266
1282
  fake_request.get(urljoin(test_url + '/', 'reproducer'), text='reproducer contents')
1267
1283
  fake_request.get(urljoin(test_url + '/', 'tux_plan.yaml'), text='tux_plan.yaml contents')
1268
1284
  fake_request.get(test_url, json=job_data)
1269
1285
 
1270
1286
  status, completed, metadata, tests, metrics, logs, attachments = self.tuxsuite.fetch(testjob)
1271
- tests_results = {k: v["result"] for k, v in tests.items()}
1287
+ tests_results = {k: v["result"] for k, v in tests.items() if not k.startswith("lava/")}
1272
1288
  self.assertEqual('Complete', status)
1273
1289
  self.assertTrue(completed)
1274
1290
  self.assertEqual(sorted(expected_metadata.items()), sorted(metadata.items()))
@@ -1283,6 +1299,7 @@ class TuxSuiteTest(TestCase):
1283
1299
  testjob = self.build.test_jobs.create(target=self.project, backend=self.backend, job_id=job_id)
1284
1300
  test_url = urljoin(TUXSUITE_URL, '/groups/tuxgroup/projects/tuxproject/tests/125')
1285
1301
  build_url = urljoin(TUXSUITE_URL, '/groups/tuxgroup/projects/tuxproject/builds/567')
1302
+ storage_url = "https://storage.example.com/tuxgroup/tuxproject/123/"
1286
1303
 
1287
1304
  # Only fetch when finished
1288
1305
  with requests_mock.Mocker() as fake_request:
@@ -1291,6 +1308,7 @@ class TuxSuiteTest(TestCase):
1291
1308
  self.assertEqual(None, results)
1292
1309
 
1293
1310
  test_logs = 'dummy test log'
1311
+ yaml_logs = '- {"dt": "2025-04-09T13:15:59.421673", "lvl": "info", "msg": "dummy test log"}'
1294
1312
  test_results = {
1295
1313
  'project': 'tuxgroup/tuxproject',
1296
1314
  'device': 'qemu-armv7',
@@ -1319,7 +1337,8 @@ class TuxSuiteTest(TestCase):
1319
1337
  'finished_time': '2022-03-25T15:52:42.672483',
1320
1338
  'retries': 0,
1321
1339
  'retries_messages': [],
1322
- 'duration': 151
1340
+ 'duration': 151,
1341
+ 'download_url': storage_url,
1323
1342
  }
1324
1343
  build_results = {
1325
1344
  'toolchain': 'gcc-10',
@@ -1365,12 +1384,13 @@ class TuxSuiteTest(TestCase):
1365
1384
  fake_request.get(test_url, json=test_results)
1366
1385
  fake_request.get(build_url, json=build_results)
1367
1386
  fake_request.get(urljoin(test_url + '/', 'logs'), text=test_logs)
1387
+ fake_request.get(urljoin(storage_url + '/', 'lava-logs.yaml'), text=yaml_logs)
1368
1388
  fake_request.get(urljoin(test_url + '/', 'results'), json=test_results_json)
1369
1389
  fake_request.get(urljoin(test_url + '/', 'reproducer'), text='reproducer contents')
1370
1390
  fake_request.get(urljoin(test_url + '/', 'tux_plan.yaml'), text='tux_plan.yaml contents')
1371
1391
 
1372
1392
  status, completed, metadata, tests, metrics, logs, attachments = self.tuxsuite.fetch(testjob)
1373
- tests_results = {k: v["result"] for k, v in tests.items()}
1393
+ tests_results = {k: v["result"] for k, v in tests.items() if not k.startswith("lava/")}
1374
1394
  self.assertEqual('Complete', status)
1375
1395
  self.assertTrue(completed)
1376
1396
  self.assertEqual(sorted(expected_metadata.items()), sorted(metadata.items()))
@@ -1585,8 +1605,10 @@ class TuxSuiteTest(TestCase):
1585
1605
  test_url = urljoin(TUXSUITE_URL, '/groups/tuxgroup/projects/tuxproject/tests/124')
1586
1606
  sanity_test_url = urljoin(TUXSUITE_URL, '/groups/tuxgroup/projects/tuxproject/tests/123')
1587
1607
  build_url = urljoin(TUXSUITE_URL, '/groups/tuxgroup/projects/tuxproject/builds/456')
1608
+ storage_url = "https://storage.example.com/tuxgroup/tuxproject/123/"
1588
1609
 
1589
1610
  test_logs = 'dummy test log'
1611
+ yaml_logs = '- {"dt": "2025-04-09T13:15:59.421673", "lvl": "info", "msg": "dumumy test log"}'
1590
1612
  test_results = {
1591
1613
  'project': 'tuxgroup/tuxproject',
1592
1614
  'uid': '124',
@@ -1596,6 +1618,7 @@ class TuxSuiteTest(TestCase):
1596
1618
  'results': {'boot': 'pass', 'ltp-smoke': 'pass'},
1597
1619
  'plan': None,
1598
1620
  'waiting_for': 'TEST#123',
1621
+ 'download_url': storage_url,
1599
1622
  }
1600
1623
  sanity_test_results = {
1601
1624
  'project': 'tuxgroup/tuxproject',
@@ -1646,12 +1669,13 @@ class TuxSuiteTest(TestCase):
1646
1669
  fake_request.get(sanity_test_url, json=sanity_test_results)
1647
1670
  fake_request.get(build_url, json=build_results)
1648
1671
  fake_request.get(urljoin(test_url + '/', 'logs'), text=test_logs)
1672
+ fake_request.get(urljoin(storage_url, 'lava-logs.yaml'), text=yaml_logs)
1649
1673
  fake_request.get(urljoin(test_url + '/', 'results'), json=test_results_json)
1650
1674
  fake_request.get(urljoin(test_url + '/', 'reproducer'), text='reproducer contents')
1651
1675
  fake_request.get(urljoin(test_url + '/', 'tux_plan.yaml'), text='tux_plan.yaml contents')
1652
1676
 
1653
1677
  status, completed, metadata, tests, metrics, logs, attachments = self.tuxsuite.fetch(testjob)
1654
- tests_results = {k: v["result"] for k, v in tests.items()}
1678
+ tests_results = {k: v["result"] for k, v in tests.items() if not k.startswith("lava/")}
1655
1679
  self.assertEqual('Complete', status)
1656
1680
  self.assertTrue(completed)
1657
1681
  self.assertEqual(sorted(expected_metadata.items()), sorted(metadata.items()))
@@ -1659,7 +1683,7 @@ class TuxSuiteTest(TestCase):
1659
1683
  self.assertEqual(sorted(expected_metrics.items()), sorted(metrics.items()))
1660
1684
  self.assertEqual(test_logs, logs)
1661
1685
 
1662
- self.assertEqual(7, fake_request.call_count)
1686
+ self.assertEqual(9, fake_request.call_count)
1663
1687
 
1664
1688
  self.assertEqual('ltp-smoke', testjob.name)
1665
1689
 
@@ -1671,8 +1695,10 @@ class TuxSuiteTest(TestCase):
1671
1695
  test_url = urljoin(TUXSUITE_URL, '/groups/tuxgroup/projects/tuxproject/tests/124')
1672
1696
  sanity_test_url = urljoin(TUXSUITE_URL, '/groups/tuxgroup/projects/tuxproject/tests/112233')
1673
1697
  build_url = urljoin(TUXSUITE_URL, '/groups/tuxgroup/projects/tuxproject/builds/456')
1698
+ storage_url = "https://storage.example.com/tuxgroup/tuxproject/123/"
1674
1699
 
1675
1700
  test_logs = 'dummy test log'
1701
+ yaml_logs = '- {"dt": "2025-04-09T13:15:59.421673", "lvl": "info", "msg": "dummy test log"}'
1676
1702
  test_results = {
1677
1703
  'project': 'tuxgroup/tuxproject',
1678
1704
  'uid': '124',
@@ -1682,6 +1708,7 @@ class TuxSuiteTest(TestCase):
1682
1708
  'results': {'boot': 'pass', 'ltp-smoke': 'pass'},
1683
1709
  'plan': None,
1684
1710
  'waiting_for': 'TEST#112233',
1711
+ 'download_url': storage_url,
1685
1712
  }
1686
1713
  sanity_test_results = {
1687
1714
  'project': 'tuxgroup/tuxproject',
@@ -1693,6 +1720,7 @@ class TuxSuiteTest(TestCase):
1693
1720
  'result': 'pass',
1694
1721
  'results': {'boot': 'pass', 'ltp-smoke': 'pass'},
1695
1722
  'plan': None,
1723
+ 'download_url': storage_url,
1696
1724
  }
1697
1725
  build_results = {
1698
1726
  'toolchain': 'gcc-10',
@@ -1711,6 +1739,7 @@ class TuxSuiteTest(TestCase):
1711
1739
  fake_request.get(build_url, json=build_results)
1712
1740
  fake_request.get(urljoin(test_url + '/', 'logs'), text=test_logs)
1713
1741
  fake_request.get(urljoin(sanity_test_url + '/', 'logs'), text=test_logs)
1742
+ fake_request.get(urljoin(storage_url, 'lava-logs.yaml'), text=yaml_logs)
1714
1743
  fake_request.get(urljoin(test_url + '/', 'results'), json=test_results_json)
1715
1744
  fake_request.get(urljoin(sanity_test_url + '/', 'results'), json=test_results_json)
1716
1745
  fake_request.get(urljoin(test_url + '/', 'reproducer'), text='reproducer contents')
@@ -1731,12 +1760,12 @@ class TuxSuiteTest(TestCase):
1731
1760
  completed=completed,
1732
1761
  attachments=attachments,
1733
1762
  )
1734
- self.assertEqual(6, fake_request.call_count)
1763
+ self.assertEqual(8, fake_request.call_count)
1735
1764
 
1736
1765
  # Now fetch test, and make sure no extra requests were made
1737
1766
  _, _, metadata, _, _, _, _ = self.tuxsuite.fetch(testjob)
1738
1767
  self.assertEqual(build_name, metadata['build_name'])
1739
- self.assertEqual(11, fake_request.call_count)
1768
+ self.assertEqual(15, fake_request.call_count)
1740
1769
 
1741
1770
  self.assertEqual('ltp-smoke', testjob.name)
1742
1771
 
@@ -4,18 +4,30 @@
4
4
  "result": "pass"
5
5
  },
6
6
  "file-download": {
7
- "duration": "9.95",
8
- "extra": {
9
- "label": "rootfs",
10
- "md5sum": "89e4eea0fecf498dcc97e37b17daad5f",
11
- "sha256sum": "d0bd412d3c540d821447e39a94bba91864f7b143b966c80f247857fa708057db",
12
- "sha512sum": "c36c5ed44ab8b207e1250c770f6ba4f5f67f4d40d53d450589cd567c070a38ff2f626d0322f18acfcdc29db73774821f181ffb731010c334e2b0ab1c36daa673",
13
- "size": 48628967
7
+ "url_repo": {
8
+ "namespace": "common",
9
+ "level": "1.1.3.1.1.1",
10
+ "duration": "0.44",
11
+ "result": "pass",
12
+ "extra": {
13
+ "label": "url_repo",
14
+ "size": 13697125,
15
+ "sha256sum": "2b93882efdc3ea9db81de6e9aeeabab6d35dcf95a898aeaa995db44583b29062"
16
+ }
14
17
  },
15
- "level": "1.5.1",
16
- "namespace": "common",
17
- "result": "pass"
18
- },
18
+ "rootfs": {
19
+ "namespace": "common",
20
+ "level": "1.5.1",
21
+ "duration": "8.99",
22
+ "result": "pass",
23
+ "extra": {
24
+ "label": "rootfs",
25
+ "size": 111407012,
26
+ "sha256sum": "71bcc7bc8dbd4ac7d02d52aed8886662999d6e6c790f9b9e5220beaf580ccfc1"
27
+ },
28
+ "url": "https://storage.tuxboot.com/debian/trixie/arm64/rootfs.ext4.xz"
29
+ }
30
+ },
19
31
  "test-overlay": {
20
32
  "duration": "0.00",
21
33
  "extra": {
@@ -183,9 +195,9 @@
183
195
  "starttc": 994
184
196
  },
185
197
  "ping602": {
186
- "endtc": 997,
198
+ "endtc": "997",
187
199
  "result": "skip",
188
- "starttc": 997
200
+ "starttc": "997"
189
201
  }
190
202
  }
191
203
  }