squad 1.89__tar.gz → 1.90__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (642) hide show
  1. {squad-1.89 → squad-1.90}/CHANGELOG.md +7 -0
  2. {squad-1.89 → squad-1.90}/MANIFEST.in +1 -1
  3. squad-1.90/PKG-INFO +14 -0
  4. {squad-1.89 → squad-1.90}/dev-docker +23 -10
  5. {squad-1.89 → squad-1.90}/scripts/build +1 -4
  6. {squad-1.89 → squad-1.90}/scripts/release +4 -1
  7. {squad-1.89 → squad-1.90}/squad/api/views.py +1 -1
  8. {squad-1.89 → squad-1.90}/squad/core/management/commands/import_data.py +2 -1
  9. {squad-1.89 → squad-1.90}/squad/core/models.py +2 -2
  10. {squad-1.89 → squad-1.90}/squad/core/tasks/__init__.py +3 -3
  11. {squad-1.89 → squad-1.90}/squad/core/utils.py +7 -4
  12. squad-1.90/squad/plugins/lib/__init__.py +1 -0
  13. squad-1.90/squad/plugins/lib/base_log_parser.py +152 -0
  14. squad-1.90/squad/plugins/linux_log_parser.py +68 -0
  15. {squad-1.89 → squad-1.90}/squad/settings.py +15 -11
  16. squad-1.90/squad/version.py +1 -0
  17. squad-1.90/squad.egg-info/PKG-INFO +14 -0
  18. {squad-1.89 → squad-1.90}/squad.egg-info/SOURCES.txt +3 -3
  19. {squad-1.89 → squad-1.90}/squad.egg-info/entry_points.txt +1 -0
  20. squad-1.90/test/plugins/test_log_parser_base.py +260 -0
  21. squad-1.89/.github/workflows/release.yml +0 -42
  22. squad-1.89/.github/workflows/test.yml +0 -100
  23. squad-1.89/PKG-INFO +0 -45
  24. squad-1.89/scripts/upload +0 -14
  25. squad-1.89/squad/plugins/linux_log_parser.py +0 -183
  26. squad-1.89/squad/version.py +0 -1
  27. squad-1.89/squad.egg-info/PKG-INFO +0 -45
  28. {squad-1.89 → squad-1.90}/.ackrc +0 -0
  29. {squad-1.89 → squad-1.90}/.coveragerc +0 -0
  30. {squad-1.89 → squad-1.90}/.ctags +0 -0
  31. {squad-1.89 → squad-1.90}/.dockerignore +0 -0
  32. {squad-1.89 → squad-1.90}/.gitignore +0 -0
  33. {squad-1.89 → squad-1.90}/.mailmap +0 -0
  34. {squad-1.89 → squad-1.90}/.readthedocs.yml +0 -0
  35. {squad-1.89 → squad-1.90}/.reuse/dep5 +0 -0
  36. {squad-1.89 → squad-1.90}/COPYING +0 -0
  37. {squad-1.89 → squad-1.90}/COPYRIGHTS +0 -0
  38. {squad-1.89 → squad-1.90}/Dockerfile +0 -0
  39. {squad-1.89 → squad-1.90}/LICENSES/GPL-3.0-or-later.txt +0 -0
  40. {squad-1.89 → squad-1.90}/LICENSES/MIT.txt +0 -0
  41. {squad-1.89 → squad-1.90}/LICENSES/OFL-1.1.txt +0 -0
  42. {squad-1.89 → squad-1.90}/Procfile +0 -0
  43. {squad-1.89 → squad-1.90}/README.rst +0 -0
  44. {squad-1.89 → squad-1.90}/babel.cfg +0 -0
  45. {squad-1.89 → squad-1.90}/doc/.gitignore +0 -0
  46. {squad-1.89 → squad-1.90}/doc/Makefile +0 -0
  47. {squad-1.89 → squad-1.90}/doc/api.rst +0 -0
  48. {squad-1.89 → squad-1.90}/doc/ci.rst +0 -0
  49. {squad-1.89 → squad-1.90}/doc/conf.py +0 -0
  50. {squad-1.89 → squad-1.90}/doc/hacking.rst +0 -0
  51. {squad-1.89 → squad-1.90}/doc/index.rst +0 -0
  52. {squad-1.89 → squad-1.90}/doc/install.rst +0 -0
  53. {squad-1.89 → squad-1.90}/doc/intro.rst +0 -0
  54. {squad-1.89 → squad-1.90}/doc/lava_usecase.rst +0 -0
  55. {squad-1.89 → squad-1.90}/doc/plugins.rst +0 -0
  56. {squad-1.89 → squad-1.90}/doc/quickstart.rst +0 -0
  57. {squad-1.89 → squad-1.90}/doc/translating.rst +0 -0
  58. {squad-1.89 → squad-1.90}/doc/tuxsuite_usecase.rst +0 -0
  59. {squad-1.89 → squad-1.90}/docker/db-dumped +0 -0
  60. {squad-1.89 → squad-1.90}/docker/db-to-be-restored +0 -0
  61. {squad-1.89 → squad-1.90}/docker/docker-compose.yml +0 -0
  62. {squad-1.89 → squad-1.90}/docker/extra_settings.py +0 -0
  63. {squad-1.89 → squad-1.90}/docker/init-db.sh +0 -0
  64. {squad-1.89 → squad-1.90}/docker/rabbitmq.config +0 -0
  65. {squad-1.89 → squad-1.90}/docker/squad-apache.conf +0 -0
  66. {squad-1.89 → squad-1.90}/docker-compose.yaml +0 -0
  67. {squad-1.89 → squad-1.90}/manage.py +0 -0
  68. {squad-1.89 → squad-1.90}/package-lock.json +0 -0
  69. {squad-1.89 → squad-1.90}/package.json +0 -0
  70. {squad-1.89 → squad-1.90}/pytest.ini +0 -0
  71. {squad-1.89 → squad-1.90}/requirements-dev.txt +0 -0
  72. {squad-1.89 → squad-1.90}/requirements.txt +0 -0
  73. {squad-1.89 → squad-1.90}/scripts/check-ci +0 -0
  74. {squad-1.89 → squad-1.90}/scripts/check-ignore +0 -0
  75. {squad-1.89 → squad-1.90}/scripts/community_connector/main.js +0 -0
  76. {squad-1.89 → squad-1.90}/scripts/community_connector/manifest.json +0 -0
  77. {squad-1.89 → squad-1.90}/scripts/dogfood +0 -0
  78. {squad-1.89 → squad-1.90}/scripts/get-metrics +0 -0
  79. {squad-1.89 → squad-1.90}/scripts/get-tests +0 -0
  80. {squad-1.89 → squad-1.90}/scripts/git-build +0 -0
  81. {squad-1.89 → squad-1.90}/scripts/pytest +0 -0
  82. {squad-1.89 → squad-1.90}/scripts/rabbitmq-server +0 -0
  83. {squad-1.89 → squad-1.90}/scripts/release-docker +0 -0
  84. {squad-1.89 → squad-1.90}/scripts/squad-config +0 -0
  85. {squad-1.89 → squad-1.90}/scripts/test-ci +0 -0
  86. {squad-1.89 → squad-1.90}/scripts/test-docker +0 -0
  87. {squad-1.89 → squad-1.90}/scripts/testdata/gen-ci-jobs +0 -0
  88. {squad-1.89 → squad-1.90}/scripts/testdata/gen-metrics +0 -0
  89. {squad-1.89 → squad-1.90}/scripts/testdata/gen-test-data +0 -0
  90. {squad-1.89 → squad-1.90}/scripts/testdata/gen-tests +0 -0
  91. {squad-1.89 → squad-1.90}/scripts/testdata/setup-dev +0 -0
  92. {squad-1.89 → squad-1.90}/scripts/testdata/submit-ci-jobs +0 -0
  93. {squad-1.89 → squad-1.90}/scripts/testdata/submit-test-data +0 -0
  94. {squad-1.89 → squad-1.90}/scripts/translate +0 -0
  95. {squad-1.89 → squad-1.90}/scripts/travis-lava +0 -0
  96. {squad-1.89 → squad-1.90}/scripts/update-translation-files +0 -0
  97. {squad-1.89 → squad-1.90}/setup.cfg +0 -0
  98. {squad-1.89 → squad-1.90}/setup.py +0 -0
  99. {squad-1.89 → squad-1.90}/squad/__init__.py +0 -0
  100. {squad-1.89 → squad-1.90}/squad/admin.py +0 -0
  101. {squad-1.89 → squad-1.90}/squad/api/__init__.py +0 -0
  102. {squad-1.89 → squad-1.90}/squad/api/apps.py +0 -0
  103. {squad-1.89 → squad-1.90}/squad/api/ci.py +0 -0
  104. {squad-1.89 → squad-1.90}/squad/api/data.py +0 -0
  105. {squad-1.89 → squad-1.90}/squad/api/filters.py +0 -0
  106. {squad-1.89 → squad-1.90}/squad/api/rest.py +0 -0
  107. {squad-1.89 → squad-1.90}/squad/api/urls.py +0 -0
  108. {squad-1.89 → squad-1.90}/squad/api/utils.py +0 -0
  109. {squad-1.89 → squad-1.90}/squad/celery.py +0 -0
  110. {squad-1.89 → squad-1.90}/squad/ci/__init__.py +0 -0
  111. {squad-1.89 → squad-1.90}/squad/ci/admin.py +0 -0
  112. {squad-1.89 → squad-1.90}/squad/ci/apps.py +0 -0
  113. {squad-1.89 → squad-1.90}/squad/ci/backend/__init__.py +0 -0
  114. {squad-1.89 → squad-1.90}/squad/ci/backend/fake.py +0 -0
  115. {squad-1.89 → squad-1.90}/squad/ci/backend/lava.py +0 -0
  116. {squad-1.89 → squad-1.90}/squad/ci/backend/null.py +0 -0
  117. {squad-1.89 → squad-1.90}/squad/ci/backend/tuxsuite.py +0 -0
  118. {squad-1.89 → squad-1.90}/squad/ci/exceptions.py +0 -0
  119. {squad-1.89 → squad-1.90}/squad/ci/management/__init__.py +0 -0
  120. {squad-1.89 → squad-1.90}/squad/ci/management/commands/__init__.py +0 -0
  121. {squad-1.89 → squad-1.90}/squad/ci/management/commands/create_tuxsuite_boot_tests.py +0 -0
  122. {squad-1.89 → squad-1.90}/squad/ci/management/commands/listen.py +0 -0
  123. {squad-1.89 → squad-1.90}/squad/ci/management/commands/testfetch.py +0 -0
  124. {squad-1.89 → squad-1.90}/squad/ci/migrations/0001_initial.py +0 -0
  125. {squad-1.89 → squad-1.90}/squad/ci/migrations/0002_auto_20170406_1252.py +0 -0
  126. {squad-1.89 → squad-1.90}/squad/ci/migrations/0003_backend_name.py +0 -0
  127. {squad-1.89 → squad-1.90}/squad/ci/migrations/0004_testjob_failure.py +0 -0
  128. {squad-1.89 → squad-1.90}/squad/ci/migrations/0005_remove_listener_data.py +0 -0
  129. {squad-1.89 → squad-1.90}/squad/ci/migrations/0006_simplify_backend_loading.py +0 -0
  130. {squad-1.89 → squad-1.90}/squad/ci/migrations/0007_auto_20170517_1736.py +0 -0
  131. {squad-1.89 → squad-1.90}/squad/ci/migrations/0008_testjob_testrun.py +0 -0
  132. {squad-1.89 → squad-1.90}/squad/ci/migrations/0009_slug_pattern.py +0 -0
  133. {squad-1.89 → squad-1.90}/squad/ci/migrations/0010_testjob_can_resubmit.py +0 -0
  134. {squad-1.89 → squad-1.90}/squad/ci/migrations/0011_testjob_resubmitted_count.py +0 -0
  135. {squad-1.89 → squad-1.90}/squad/ci/migrations/0012_testjob_build.py +0 -0
  136. {squad-1.89 → squad-1.90}/squad/ci/migrations/0013_testjob_name.py +0 -0
  137. {squad-1.89 → squad-1.90}/squad/ci/migrations/0014_testjob_target_build.py +0 -0
  138. {squad-1.89 → squad-1.90}/squad/ci/migrations/0015_testjob_populate_target_build.py +0 -0
  139. {squad-1.89 → squad-1.90}/squad/ci/migrations/0016_backend_max_fetch_attempts.py +0 -0
  140. {squad-1.89 → squad-1.90}/squad/ci/migrations/0017_testjob_fetch_attempts.py +0 -0
  141. {squad-1.89 → squad-1.90}/squad/ci/migrations/0018_testjob_dates.py +0 -0
  142. {squad-1.89 → squad-1.90}/squad/ci/migrations/0019_add_fake_backend.py +0 -0
  143. {squad-1.89 → squad-1.90}/squad/ci/migrations/0020_backend_settings_field.py +0 -0
  144. {squad-1.89 → squad-1.90}/squad/ci/migrations/0021_testjob_parent_job.py +0 -0
  145. {squad-1.89 → squad-1.90}/squad/ci/migrations/0022_backend_poll_enabled.py +0 -0
  146. {squad-1.89 → squad-1.90}/squad/ci/migrations/0023_remove_testjob_build.py +0 -0
  147. {squad-1.89 → squad-1.90}/squad/ci/migrations/0024_fix_testjob_environment_validation.py +0 -0
  148. {squad-1.89 → squad-1.90}/squad/ci/migrations/0025_backend_listen_enabled.py +0 -0
  149. {squad-1.89 → squad-1.90}/squad/ci/migrations/0026_job_start_end_time.py +0 -0
  150. {squad-1.89 → squad-1.90}/squad/ci/migrations/0027_add_tuxsuite_implementation_type.py +0 -0
  151. {squad-1.89 → squad-1.90}/squad/ci/migrations/0028_create_testjob_indexes.py +0 -0
  152. {squad-1.89 → squad-1.90}/squad/ci/migrations/0029_create_testjob_results_input.py +0 -0
  153. {squad-1.89 → squad-1.90}/squad/ci/migrations/0030_testjob_subtasks_count.py +0 -0
  154. {squad-1.89 → squad-1.90}/squad/ci/migrations/__init__.py +0 -0
  155. {squad-1.89 → squad-1.90}/squad/ci/models.py +0 -0
  156. {squad-1.89 → squad-1.90}/squad/ci/tasks.py +0 -0
  157. {squad-1.89 → squad-1.90}/squad/ci/templates/squad/ci/testjob_resubmit.html.jinja2 +0 -0
  158. {squad-1.89 → squad-1.90}/squad/ci/templates/squad/ci/testjob_resubmit.txt.jinja2 +0 -0
  159. {squad-1.89 → squad-1.90}/squad/ci/templatetags/__init__.py +0 -0
  160. {squad-1.89 → squad-1.90}/squad/ci/templatetags/filter_jobs.py +0 -0
  161. {squad-1.89 → squad-1.90}/squad/ci/utils.py +0 -0
  162. {squad-1.89 → squad-1.90}/squad/compat.py +0 -0
  163. {squad-1.89 → squad-1.90}/squad/container_settings.py +0 -0
  164. {squad-1.89 → squad-1.90}/squad/core/__init__.py +0 -0
  165. {squad-1.89 → squad-1.90}/squad/core/admin.py +0 -0
  166. {squad-1.89 → squad-1.90}/squad/core/apps.py +0 -0
  167. {squad-1.89 → squad-1.90}/squad/core/callback.py +0 -0
  168. {squad-1.89 → squad-1.90}/squad/core/comparison.py +0 -0
  169. {squad-1.89 → squad-1.90}/squad/core/data.py +0 -0
  170. {squad-1.89 → squad-1.90}/squad/core/failures.py +0 -0
  171. {squad-1.89 → squad-1.90}/squad/core/history.py +0 -0
  172. {squad-1.89 → squad-1.90}/squad/core/locale/django.pot +0 -0
  173. {squad-1.89 → squad-1.90}/squad/core/locale/es_MX/LC_MESSAGES/django.po +0 -0
  174. {squad-1.89 → squad-1.90}/squad/core/locale/pl/LC_MESSAGES/django.po +0 -0
  175. {squad-1.89 → squad-1.90}/squad/core/locale/pt/LC_MESSAGES/django.po +0 -0
  176. {squad-1.89 → squad-1.90}/squad/core/locale/pt_BR/LC_MESSAGES/django.po +0 -0
  177. {squad-1.89 → squad-1.90}/squad/core/management/__init__.py +0 -0
  178. {squad-1.89 → squad-1.90}/squad/core/management/commands/__init__.py +0 -0
  179. {squad-1.89 → squad-1.90}/squad/core/management/commands/compute_build_summaries.py +0 -0
  180. {squad-1.89 → squad-1.90}/squad/core/management/commands/compute_project_statuses.py +0 -0
  181. {squad-1.89 → squad-1.90}/squad/core/management/commands/fill_test_metadata.py +0 -0
  182. {squad-1.89 → squad-1.90}/squad/core/management/commands/fix_squadplugin_data.py +0 -0
  183. {squad-1.89 → squad-1.90}/squad/core/management/commands/import_data.rst +0 -0
  184. {squad-1.89 → squad-1.90}/squad/core/management/commands/migrate_test_runs.py +0 -0
  185. {squad-1.89 → squad-1.90}/squad/core/management/commands/populate_metric_build_and_environment.py +0 -0
  186. {squad-1.89 → squad-1.90}/squad/core/management/commands/populate_test_build_and_environment.py +0 -0
  187. {squad-1.89 → squad-1.90}/squad/core/management/commands/prepdump.py +0 -0
  188. {squad-1.89 → squad-1.90}/squad/core/management/commands/send-email.py +0 -0
  189. {squad-1.89 → squad-1.90}/squad/core/management/commands/update_project_statuses.py +0 -0
  190. {squad-1.89 → squad-1.90}/squad/core/management/commands/users.py +0 -0
  191. {squad-1.89 → squad-1.90}/squad/core/migrations/0001_initial.py +0 -0
  192. {squad-1.89 → squad-1.90}/squad/core/migrations/0002_auto_20160525_1403.py +0 -0
  193. {squad-1.89 → squad-1.90}/squad/core/migrations/0003_testrun_log_file.py +0 -0
  194. {squad-1.89 → squad-1.90}/squad/core/migrations/0004_group_user_groups.py +0 -0
  195. {squad-1.89 → squad-1.90}/squad/core/migrations/0005_token.py +0 -0
  196. {squad-1.89 → squad-1.90}/squad/core/migrations/0006_auto_20160826_2242.py +0 -0
  197. {squad-1.89 → squad-1.90}/squad/core/migrations/0007_testrun_data_processed.py +0 -0
  198. {squad-1.89 → squad-1.90}/squad/core/migrations/0008_status.py +0 -0
  199. {squad-1.89 → squad-1.90}/squad/core/migrations/0009_testrun_status_recorded.py +0 -0
  200. {squad-1.89 → squad-1.90}/squad/core/migrations/0010_testrun_datetime.py +0 -0
  201. {squad-1.89 → squad-1.90}/squad/core/migrations/0011_testrun_metadata_fields.py +0 -0
  202. {squad-1.89 → squad-1.90}/squad/core/migrations/0012_build_datetime.py +0 -0
  203. {squad-1.89 → squad-1.90}/squad/core/migrations/0013_testrun_resubmit_url.py +0 -0
  204. {squad-1.89 → squad-1.90}/squad/core/migrations/0014_testrun_metadata_file.py +0 -0
  205. {squad-1.89 → squad-1.90}/squad/core/migrations/0015_attachment.py +0 -0
  206. {squad-1.89 → squad-1.90}/squad/core/migrations/0016_project_is_public.py +0 -0
  207. {squad-1.89 → squad-1.90}/squad/core/migrations/0017_slug_validator.py +0 -0
  208. {squad-1.89 → squad-1.90}/squad/core/migrations/0018_build_name.py +0 -0
  209. {squad-1.89 → squad-1.90}/squad/core/migrations/0019_build_version.py +0 -0
  210. {squad-1.89 → squad-1.90}/squad/core/migrations/0020_build_ordering.py +0 -0
  211. {squad-1.89 → squad-1.90}/squad/core/migrations/0021_global_tokens.py +0 -0
  212. {squad-1.89 → squad-1.90}/squad/core/migrations/0022_projectstatus.py +0 -0
  213. {squad-1.89 → squad-1.90}/squad/core/migrations/0023_subscription.py +0 -0
  214. {squad-1.89 → squad-1.90}/squad/core/migrations/0024_project_build_completion_threshold.py +0 -0
  215. {squad-1.89 → squad-1.90}/squad/core/migrations/0025_unique_testrun_job_id.py +0 -0
  216. {squad-1.89 → squad-1.90}/squad/core/migrations/0026_testrun_result_accept_null.py +0 -0
  217. {squad-1.89 → squad-1.90}/squad/core/migrations/0027_project_notification_strategy.py +0 -0
  218. {squad-1.89 → squad-1.90}/squad/core/migrations/0028_suite_and_test_name_length.py +0 -0
  219. {squad-1.89 → squad-1.90}/squad/core/migrations/0029_subscription_email_formats.py +0 -0
  220. {squad-1.89 → squad-1.90}/squad/core/migrations/0030_remove_project_build_completion_threshold.py +0 -0
  221. {squad-1.89 → squad-1.90}/squad/core/migrations/0031_environment_expected_test_runs.py +0 -0
  222. {squad-1.89 → squad-1.90}/squad/core/migrations/0032_testrun_completed.py +0 -0
  223. {squad-1.89 → squad-1.90}/squad/core/migrations/0033_drop_debversion.py +0 -0
  224. {squad-1.89 → squad-1.90}/squad/core/migrations/0034_prepare_to_remove_build_name.py +0 -0
  225. {squad-1.89 → squad-1.90}/squad/core/migrations/0035_remove_build_name.py +0 -0
  226. {squad-1.89 → squad-1.90}/squad/core/migrations/0036_status_tests_skip.py +0 -0
  227. {squad-1.89 → squad-1.90}/squad/core/migrations/0037_project_status_test_summary_fields.py +0 -0
  228. {squad-1.89 → squad-1.90}/squad/core/migrations/0038_populate_project_status_cache.py +0 -0
  229. {squad-1.89 → squad-1.90}/squad/core/migrations/0039_orderings.py +0 -0
  230. {squad-1.89 → squad-1.90}/squad/core/migrations/0040_remove_subscription_html.py +0 -0
  231. {squad-1.89 → squad-1.90}/squad/core/migrations/0041_projectstatus_notified.py +0 -0
  232. {squad-1.89 → squad-1.90}/squad/core/migrations/0042_set_projectstatus_notified.py +0 -0
  233. {squad-1.89 → squad-1.90}/squad/core/migrations/0043_project_status_build.py +0 -0
  234. {squad-1.89 → squad-1.90}/squad/core/migrations/0044_project_html_mail.py +0 -0
  235. {squad-1.89 → squad-1.90}/squad/core/migrations/0045_adminsubscription.py +0 -0
  236. {squad-1.89 → squad-1.90}/squad/core/migrations/0046_projectstatus_last_updated.py +0 -0
  237. {squad-1.89 → squad-1.90}/squad/core/migrations/0047_populate_projectstatus_last_updated.py +0 -0
  238. {squad-1.89 → squad-1.90}/squad/core/migrations/0048_moderate_notifications.py +0 -0
  239. {squad-1.89 → squad-1.90}/squad/core/migrations/0049_projectstatus_plural.py +0 -0
  240. {squad-1.89 → squad-1.90}/squad/core/migrations/0050_projectstatus_finished.py +0 -0
  241. {squad-1.89 → squad-1.90}/squad/core/migrations/0051_build_status.py +0 -0
  242. {squad-1.89 → squad-1.90}/squad/core/migrations/0052_recreate_projectstatus_data.py +0 -0
  243. {squad-1.89 → squad-1.90}/squad/core/migrations/0053_remove_projectstatus_previous.py +0 -0
  244. {squad-1.89 → squad-1.90}/squad/core/migrations/0054_custom_email_template.py +0 -0
  245. {squad-1.89 → squad-1.90}/squad/core/migrations/0055_emailtemplate_subject.py +0 -0
  246. {squad-1.89 → squad-1.90}/squad/core/migrations/0056_project_description.py +0 -0
  247. {squad-1.89 → squad-1.90}/squad/core/migrations/0057_projectstatus_has_metrics.py +0 -0
  248. {squad-1.89 → squad-1.90}/squad/core/migrations/0058_populate_projectstatus_has_metrics.py +0 -0
  249. {squad-1.89 → squad-1.90}/squad/core/migrations/0059_project_important_metadata_keys.py +0 -0
  250. {squad-1.89 → squad-1.90}/squad/core/migrations/0060_test_log.py +0 -0
  251. {squad-1.89 → squad-1.90}/squad/core/migrations/0061_project_enabled_plugins_list.py +0 -0
  252. {squad-1.89 → squad-1.90}/squad/core/migrations/0062_project_allow_empty_enabled_plugin_list.py +0 -0
  253. {squad-1.89 → squad-1.90}/squad/core/migrations/0063_project_wait_before_notification.py +0 -0
  254. {squad-1.89 → squad-1.90}/squad/core/migrations/0064_project_notification_timeout.py +0 -0
  255. {squad-1.89 → squad-1.90}/squad/core/migrations/0065_projectstatus_notified_on_timeout.py +0 -0
  256. {squad-1.89 → squad-1.90}/squad/core/migrations/0066_environment_description.py +0 -0
  257. {squad-1.89 → squad-1.90}/squad/core/migrations/0067_accept_blank_suite_name.py +0 -0
  258. {squad-1.89 → squad-1.90}/squad/core/migrations/0068_suite_version.py +0 -0
  259. {squad-1.89 → squad-1.90}/squad/core/migrations/0069_suite_metadata.py +0 -0
  260. {squad-1.89 → squad-1.90}/squad/core/migrations/0070_create_suite_test_and_metric_metadata.py +0 -0
  261. {squad-1.89 → squad-1.90}/squad/core/migrations/0071_migrate_old_tokens.py +0 -0
  262. {squad-1.89 → squad-1.90}/squad/core/migrations/0072_group_description.py +0 -0
  263. {squad-1.89 → squad-1.90}/squad/core/migrations/0073_auto_20180420_1643.py +0 -0
  264. {squad-1.89 → squad-1.90}/squad/core/migrations/0074_add_indexes.py +0 -0
  265. {squad-1.89 → squad-1.90}/squad/core/migrations/0075_update_project_enabled_plugin_list.py +0 -0
  266. {squad-1.89 → squad-1.90}/squad/core/migrations/0076_patch_builds.py +0 -0
  267. {squad-1.89 → squad-1.90}/squad/core/migrations/0077_knownissue.py +0 -0
  268. {squad-1.89 → squad-1.90}/squad/core/migrations/0078_cache_test_run_counts.py +0 -0
  269. {squad-1.89 → squad-1.90}/squad/core/migrations/0079_init_cache_test_run_counts.py +0 -0
  270. {squad-1.89 → squad-1.90}/squad/core/migrations/0080_auto_20180810_0047.py +0 -0
  271. {squad-1.89 → squad-1.90}/squad/core/migrations/0081_status_has_metrics.py +0 -0
  272. {squad-1.89 → squad-1.90}/squad/core/migrations/0082_populate_status_has_metrics.py +0 -0
  273. {squad-1.89 → squad-1.90}/squad/core/migrations/0083_rename_knownissue_environments.py +0 -0
  274. {squad-1.89 → squad-1.90}/squad/core/migrations/0084_projectstatus_regressions_fixes.py +0 -0
  275. {squad-1.89 → squad-1.90}/squad/core/migrations/0085_projectstatus_defaults.py +0 -0
  276. {squad-1.89 → squad-1.90}/squad/core/migrations/0086_xfail.py +0 -0
  277. {squad-1.89 → squad-1.90}/squad/core/migrations/0087_test_known_issues.py +0 -0
  278. {squad-1.89 → squad-1.90}/squad/core/migrations/0088_user_subscriptions.py +0 -0
  279. {squad-1.89 → squad-1.90}/squad/core/migrations/0089_test_has_known_issues.py +0 -0
  280. {squad-1.89 → squad-1.90}/squad/core/migrations/0090_populate_test_has_known_issues.py +0 -0
  281. {squad-1.89 → squad-1.90}/squad/core/migrations/0091_notification_delivery_remove_unique_status.py +0 -0
  282. {squad-1.89 → squad-1.90}/squad/core/migrations/0092_annotation.py +0 -0
  283. {squad-1.89 → squad-1.90}/squad/core/migrations/0093_historicalemailtemplate.py +0 -0
  284. {squad-1.89 → squad-1.90}/squad/core/migrations/0094_populatehistoricalemailtemplate.py +0 -0
  285. {squad-1.89 → squad-1.90}/squad/core/migrations/0095_project_data_retention_days.py +0 -0
  286. {squad-1.89 → squad-1.90}/squad/core/migrations/0096_build_keep_data.py +0 -0
  287. {squad-1.89 → squad-1.90}/squad/core/migrations/0097_build_placeholder.py +0 -0
  288. {squad-1.89 → squad-1.90}/squad/core/migrations/0098_blank_annotation.py +0 -0
  289. {squad-1.89 → squad-1.90}/squad/core/migrations/0099_metricthreshold.py +0 -0
  290. {squad-1.89 → squad-1.90}/squad/core/migrations/0100_metric_is_outlier.py +0 -0
  291. {squad-1.89 → squad-1.90}/squad/core/migrations/0101_project_project_settings.py +0 -0
  292. {squad-1.89 → squad-1.90}/squad/core/migrations/0102_projectstatus_null_metric_summary.py +0 -0
  293. {squad-1.89 → squad-1.90}/squad/core/migrations/0103_populate_project_status.py +0 -0
  294. {squad-1.89 → squad-1.90}/squad/core/migrations/0104_delayedreport.py +0 -0
  295. {squad-1.89 → squad-1.90}/squad/core/migrations/0105_delayed_report_error_message.py +0 -0
  296. {squad-1.89 → squad-1.90}/squad/core/migrations/0106_delayedreport_output_subject.py +0 -0
  297. {squad-1.89 → squad-1.90}/squad/core/migrations/0107_move_notification_strategy.py +0 -0
  298. {squad-1.89 → squad-1.90}/squad/core/migrations/0108_add_email_template_validator.py +0 -0
  299. {squad-1.89 → squad-1.90}/squad/core/migrations/0109_group_member.py +0 -0
  300. {squad-1.89 → squad-1.90}/squad/core/migrations/0110_move_users_from_django_groups_to_squad_groups.py +0 -0
  301. {squad-1.89 → squad-1.90}/squad/core/migrations/0111_remove_group_user_groups.py +0 -0
  302. {squad-1.89 → squad-1.90}/squad/core/migrations/0112_user_namespaces.py +0 -0
  303. {squad-1.89 → squad-1.90}/squad/core/migrations/0113_group_project_blank_name_and_description.py +0 -0
  304. {squad-1.89 → squad-1.90}/squad/core/migrations/0114_project_enabled_plugin_list_can_be_blank.py +0 -0
  305. {squad-1.89 → squad-1.90}/squad/core/migrations/0115_fix_slug_validation.py +0 -0
  306. {squad-1.89 → squad-1.90}/squad/core/migrations/0116_make_group_membership_unique.py +0 -0
  307. {squad-1.89 → squad-1.90}/squad/core/migrations/0117_drop_obsolete_token_model.py +0 -0
  308. {squad-1.89 → squad-1.90}/squad/core/migrations/0118_project_is_archived.py +0 -0
  309. {squad-1.89 → squad-1.90}/squad/core/migrations/0119_i18n.py +0 -0
  310. {squad-1.89 → squad-1.90}/squad/core/migrations/0120_buildsummary.py +0 -0
  311. {squad-1.89 → squad-1.90}/squad/core/migrations/0121_add_password_patchsource.py +0 -0
  312. {squad-1.89 → squad-1.90}/squad/core/migrations/0122_fix_patchsource_url_and_token.py +0 -0
  313. {squad-1.89 → squad-1.90}/squad/core/migrations/0123_django_upgrade_missing_migrations.py +0 -0
  314. {squad-1.89 → squad-1.90}/squad/core/migrations/0124_set_default_expected_test_runs_to_zero.py +0 -0
  315. {squad-1.89 → squad-1.90}/squad/core/migrations/0125_fix_missing_status_has_metrics_for_testruns.py +0 -0
  316. {squad-1.89 → squad-1.90}/squad/core/migrations/0126_metricthreshold_environment.py +0 -0
  317. {squad-1.89 → squad-1.90}/squad/core/migrations/0127_metric_thresholds_migrate_data.py +0 -0
  318. {squad-1.89 → squad-1.90}/squad/core/migrations/0128_metric_thresholds_remove_proj_col.py +0 -0
  319. {squad-1.89 → squad-1.90}/squad/core/migrations/0129_projectstatus_nullable_notified_on_timeout.py +0 -0
  320. {squad-1.89 → squad-1.90}/squad/core/migrations/0130_project_status_baseline_next.py +0 -0
  321. {squad-1.89 → squad-1.90}/squad/core/migrations/0131_create_squad_auth_group_and_add_users.py +0 -0
  322. {squad-1.89 → squad-1.90}/squad/core/migrations/0132_attachment_mimetype.py +0 -0
  323. {squad-1.89 → squad-1.90}/squad/core/migrations/0133_append_project_permissions_to_squad_auth_group.py +0 -0
  324. {squad-1.89 → squad-1.90}/squad/core/migrations/0134_longer_metric_name.py +0 -0
  325. {squad-1.89 → squad-1.90}/squad/core/migrations/0135_add_privileged_access_level.py +0 -0
  326. {squad-1.89 → squad-1.90}/squad/core/migrations/0136_migrate_submitters_to_privileged.py +0 -0
  327. {squad-1.89 → squad-1.90}/squad/core/migrations/0137_patchsource_token_null.py +0 -0
  328. {squad-1.89 → squad-1.90}/squad/core/migrations/0138_metric_unit.py +0 -0
  329. {squad-1.89 → squad-1.90}/squad/core/migrations/0139_nullable_test_name.py +0 -0
  330. {squad-1.89 → squad-1.90}/squad/core/migrations/0140_increase_gerrit_password_length.py +0 -0
  331. {squad-1.89 → squad-1.90}/squad/core/migrations/0141_remove_test_name.py +0 -0
  332. {squad-1.89 → squad-1.90}/squad/core/migrations/0142_add_testrun_file_storage.py +0 -0
  333. {squad-1.89 → squad-1.90}/squad/core/migrations/0143_attachment_storage.py +0 -0
  334. {squad-1.89 → squad-1.90}/squad/core/migrations/0144_attachment_data_null.py +0 -0
  335. {squad-1.89 → squad-1.90}/squad/core/migrations/0145_pluginscratch.py +0 -0
  336. {squad-1.89 → squad-1.90}/squad/core/migrations/0146_deprecate_testrun_and_attachment_data_fields.py +0 -0
  337. {squad-1.89 → squad-1.90}/squad/core/migrations/0147_add_build_and_environment_to_test.py +0 -0
  338. {squad-1.89 → squad-1.90}/squad/core/migrations/0148_remove_legacy_storage_fields.py +0 -0
  339. {squad-1.89 → squad-1.90}/squad/core/migrations/0149_build_patch_url.py +0 -0
  340. {squad-1.89 → squad-1.90}/squad/core/migrations/0150_add_new_notification_strategy.py +0 -0
  341. {squad-1.89 → squad-1.90}/squad/core/migrations/0151_callback.py +0 -0
  342. {squad-1.89 → squad-1.90}/squad/core/migrations/0152_add_build_patch_notified.py +0 -0
  343. {squad-1.89 → squad-1.90}/squad/core/migrations/0153_callback_make_response_content_blob.py +0 -0
  344. {squad-1.89 → squad-1.90}/squad/core/migrations/0154_project_add_force_finishing_builds_field.py +0 -0
  345. {squad-1.89 → squad-1.90}/squad/core/migrations/0155_add_build_and_environment_to_metric.py +0 -0
  346. {squad-1.89 → squad-1.90}/squad/core/migrations/0156_nullable_metric_name.py +0 -0
  347. {squad-1.89 → squad-1.90}/squad/core/migrations/0157_remove_metric_name.py +0 -0
  348. {squad-1.89 → squad-1.90}/squad/core/migrations/0158_add_metric_comparison_to_projectstatus.py +0 -0
  349. {squad-1.89 → squad-1.90}/squad/core/migrations/0159_nullable_metricthreshold_value.py +0 -0
  350. {squad-1.89 → squad-1.90}/squad/core/migrations/0160_add_project_to_metricthreshold.py +0 -0
  351. {squad-1.89 → squad-1.90}/squad/core/migrations/0161_add_metricthreshold_perm_to_squad_group.py +0 -0
  352. {squad-1.89 → squad-1.90}/squad/core/migrations/0162_project_add_build_confidence_settings.py +0 -0
  353. {squad-1.89 → squad-1.90}/squad/core/migrations/0163_hirtoricalemailtemplate_update.py +0 -0
  354. {squad-1.89 → squad-1.90}/squad/core/migrations/0164_django_update.py +0 -0
  355. {squad-1.89 → squad-1.90}/squad/core/migrations/0165_buildsummary_uniqueness.py +0 -0
  356. {squad-1.89 → squad-1.90}/squad/core/migrations/0166_build_is_release.py +0 -0
  357. {squad-1.89 → squad-1.90}/squad/core/migrations/0167_add_project_datetime.py +0 -0
  358. {squad-1.89 → squad-1.90}/squad/core/migrations/0168_add_group_settings.py +0 -0
  359. {squad-1.89 → squad-1.90}/squad/core/migrations/0169_userpreferences.py +0 -0
  360. {squad-1.89 → squad-1.90}/squad/core/migrations/__init__.py +0 -0
  361. {squad-1.89 → squad-1.90}/squad/core/notification.py +0 -0
  362. {squad-1.89 → squad-1.90}/squad/core/plugins.py +0 -0
  363. {squad-1.89 → squad-1.90}/squad/core/queries.py +0 -0
  364. {squad-1.89 → squad-1.90}/squad/core/statistics.py +0 -0
  365. {squad-1.89 → squad-1.90}/squad/core/tasks/exceptions.py +0 -0
  366. {squad-1.89 → squad-1.90}/squad/core/tasks/notification.py +0 -0
  367. {squad-1.89 → squad-1.90}/squad/core/templates/squad/notification/base.jinja2 +0 -0
  368. {squad-1.89 → squad-1.90}/squad/core/templates/squad/notification/diff.html.jinja2 +0 -0
  369. {squad-1.89 → squad-1.90}/squad/core/templates/squad/notification/diff.txt.jinja2 +0 -0
  370. {squad-1.89 → squad-1.90}/squad/core/templates/squad/notification/failed_test_jobs.html.jinja2 +0 -0
  371. {squad-1.89 → squad-1.90}/squad/core/templates/squad/notification/failed_test_jobs.txt.jinja2 +0 -0
  372. {squad-1.89 → squad-1.90}/squad/core/templates/squad/notification/moderation.html.jinja2 +0 -0
  373. {squad-1.89 → squad-1.90}/squad/core/templates/squad/notification/moderation.txt.jinja2 +0 -0
  374. {squad-1.89 → squad-1.90}/squad/core/templatetags/__init__.py +0 -0
  375. {squad-1.89 → squad-1.90}/squad/core/templatetags/squad_notification.py +0 -0
  376. {squad-1.89 → squad-1.90}/squad/frontend/__init__.py +0 -0
  377. {squad-1.89 → squad-1.90}/squad/frontend/__main__.py +0 -0
  378. {squad-1.89 → squad-1.90}/squad/frontend/admin.py +0 -0
  379. {squad-1.89 → squad-1.90}/squad/frontend/apps.py +0 -0
  380. {squad-1.89 → squad-1.90}/squad/frontend/badges.py +0 -0
  381. {squad-1.89 → squad-1.90}/squad/frontend/build_settings.py +0 -0
  382. {squad-1.89 → squad-1.90}/squad/frontend/ci.py +0 -0
  383. {squad-1.89 → squad-1.90}/squad/frontend/comparison.py +0 -0
  384. {squad-1.89 → squad-1.90}/squad/frontend/extract.py +0 -0
  385. {squad-1.89 → squad-1.90}/squad/frontend/forms.py +0 -0
  386. {squad-1.89 → squad-1.90}/squad/frontend/group_settings.py +0 -0
  387. {squad-1.89 → squad-1.90}/squad/frontend/locale/django.pot +0 -0
  388. {squad-1.89 → squad-1.90}/squad/frontend/locale/pl/LC_MESSAGES/django.po +0 -0
  389. {squad-1.89 → squad-1.90}/squad/frontend/locale/pt/LC_MESSAGES/django.po +0 -0
  390. {squad-1.89 → squad-1.90}/squad/frontend/locale/pt_BR/LC_MESSAGES/django.po +0 -0
  391. {squad-1.89 → squad-1.90}/squad/frontend/management/__init__.py +0 -0
  392. {squad-1.89 → squad-1.90}/squad/frontend/management/commands/__init__.py +0 -0
  393. {squad-1.89 → squad-1.90}/squad/frontend/management/commands/get_token.py +0 -0
  394. {squad-1.89 → squad-1.90}/squad/frontend/metrics.py +0 -0
  395. {squad-1.89 → squad-1.90}/squad/frontend/project_settings.py +0 -0
  396. {squad-1.89 → squad-1.90}/squad/frontend/queries.py +0 -0
  397. {squad-1.89 → squad-1.90}/squad/frontend/setup.py +0 -0
  398. {squad-1.89 → squad-1.90}/squad/frontend/static/compare.css +0 -0
  399. {squad-1.89 → squad-1.90}/squad/frontend/static/download +0 -0
  400. {squad-1.89 → squad-1.90}/squad/frontend/static/download.conf +0 -0
  401. {squad-1.89 → squad-1.90}/squad/frontend/static/favicon.ico +0 -0
  402. {squad-1.89 → squad-1.90}/squad/frontend/static/main.css +0 -0
  403. {squad-1.89 → squad-1.90}/squad/frontend/static/squad/attach_select2.js +0 -0
  404. {squad-1.89 → squad-1.90}/squad/frontend/static/squad/build.js +0 -0
  405. {squad-1.89 → squad-1.90}/squad/frontend/static/squad/build_compare.js +0 -0
  406. {squad-1.89 → squad-1.90}/squad/frontend/static/squad/build_list.js +0 -0
  407. {squad-1.89 → squad-1.90}/squad/frontend/static/squad/charts.js +0 -0
  408. {squad-1.89 → squad-1.90}/squad/frontend/static/squad/common.js +0 -0
  409. {squad-1.89 → squad-1.90}/squad/frontend/static/squad/compare.js +0 -0
  410. {squad-1.89 → squad-1.90}/squad/frontend/static/squad/config.js +0 -0
  411. {squad-1.89 → squad-1.90}/squad/frontend/static/squad/controllers/annotation.js +0 -0
  412. {squad-1.89 → squad-1.90}/squad/frontend/static/squad/controllers/build_compare.js +0 -0
  413. {squad-1.89 → squad-1.90}/squad/frontend/static/squad/controllers/build_list_compare.js +0 -0
  414. {squad-1.89 → squad-1.90}/squad/frontend/static/squad/controllers/build_release.js +0 -0
  415. {squad-1.89 → squad-1.90}/squad/frontend/static/squad/controllers/cancel.js +0 -0
  416. {squad-1.89 → squad-1.90}/squad/frontend/static/squad/controllers/charts.js +0 -0
  417. {squad-1.89 → squad-1.90}/squad/frontend/static/squad/controllers/compare.js +0 -0
  418. {squad-1.89 → squad-1.90}/squad/frontend/static/squad/controllers/fetch.js +0 -0
  419. {squad-1.89 → squad-1.90}/squad/frontend/static/squad/controllers/filter.js +0 -0
  420. {squad-1.89 → squad-1.90}/squad/frontend/static/squad/controllers/metricThreshold.js +0 -0
  421. {squad-1.89 → squad-1.90}/squad/frontend/static/squad/controllers/project_compare.js +0 -0
  422. {squad-1.89 → squad-1.90}/squad/frontend/static/squad/controllers/resubmit.js +0 -0
  423. {squad-1.89 → squad-1.90}/squad/frontend/static/squad/controllers/testjobs_progress.js +0 -0
  424. {squad-1.89 → squad-1.90}/squad/frontend/static/squad/metric.threshold.js +0 -0
  425. {squad-1.89 → squad-1.90}/squad/frontend/static/squad/project_compare.js +0 -0
  426. {squad-1.89 → squad-1.90}/squad/frontend/static/squad/showHide.js +0 -0
  427. {squad-1.89 → squad-1.90}/squad/frontend/static/squad/table.js +0 -0
  428. {squad-1.89 → squad-1.90}/squad/frontend/static/squad_sign.svg +0 -0
  429. {squad-1.89 → squad-1.90}/squad/frontend/templates/401.jinja2 +0 -0
  430. {squad-1.89 → squad-1.90}/squad/frontend/templates/404.jinja2 +0 -0
  431. {squad-1.89 → squad-1.90}/squad/frontend/templates/django/rest_framework/api.html +0 -0
  432. {squad-1.89 → squad-1.90}/squad/frontend/templates/django/squad/_user_menu.html +0 -0
  433. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/_builds_table.jinja2 +0 -0
  434. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/_env_suite_data.jinja2 +0 -0
  435. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/_metadata.jinja2 +0 -0
  436. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/_pagination.jinja2 +0 -0
  437. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/_permissions.jinja2 +0 -0
  438. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/_project_list.jinja2 +0 -0
  439. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/_regressions_and_fixes.jinja2 +0 -0
  440. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/_results_table.jinja2 +0 -0
  441. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/_results_transitions_filter.jinja2 +0 -0
  442. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/_subscribe.jinja2 +0 -0
  443. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/_test_results_envbox.jinja2 +0 -0
  444. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/_test_results_suitebox.jinja2 +0 -0
  445. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/_test_results_summary.jinja2 +0 -0
  446. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/_test_results_table.jinja2 +0 -0
  447. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/_test_run_metric.jinja2 +0 -0
  448. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/_test_run_test.jinja2 +0 -0
  449. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/_unfinished_build.jinja2 +0 -0
  450. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/_user_menu.jinja2 +0 -0
  451. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/base.jinja2 +0 -0
  452. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/build-nav.jinja2 +0 -0
  453. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/build.jinja2 +0 -0
  454. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/build_callbacks.jinja2 +0 -0
  455. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/build_metadata.jinja2 +0 -0
  456. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/build_metrics.jinja2 +0 -0
  457. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/build_settings.jinja2 +0 -0
  458. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/builds.jinja2 +0 -0
  459. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/compare.jinja2 +0 -0
  460. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/compare_builds.jinja2 +0 -0
  461. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/compare_projects.jinja2 +0 -0
  462. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/group-nav.jinja2 +0 -0
  463. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/group.jinja2 +0 -0
  464. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/group_settings/advanced.jinja2 +0 -0
  465. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/group_settings/base.jinja2 +0 -0
  466. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/group_settings/delete.jinja2 +0 -0
  467. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/group_settings/index.jinja2 +0 -0
  468. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/group_settings/members.jinja2 +0 -0
  469. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/group_settings/new_group.jinja2 +0 -0
  470. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/group_settings/new_project.jinja2 +0 -0
  471. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/index.jinja2 +0 -0
  472. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/knownissues.jinja2 +0 -0
  473. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/login.jinja2 +0 -0
  474. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/metrics.jinja2 +0 -0
  475. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/project-nav.jinja2 +0 -0
  476. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/project.jinja2 +0 -0
  477. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/project_settings/_threshold_table.jinja2 +0 -0
  478. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/project_settings/advanced.jinja2 +0 -0
  479. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/project_settings/base.jinja2 +0 -0
  480. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/project_settings/build_confidence.jinja2 +0 -0
  481. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/project_settings/delete.jinja2 +0 -0
  482. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/project_settings/environments.jinja2 +0 -0
  483. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/project_settings/index.jinja2 +0 -0
  484. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/project_settings/thresholds.jinja2 +0 -0
  485. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/test_history.jinja2 +0 -0
  486. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/test_run.jinja2 +0 -0
  487. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/test_run_suite_metrics.jinja2 +0 -0
  488. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/test_run_suite_test_details.jinja2 +0 -0
  489. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/test_run_suite_tests.jinja2 +0 -0
  490. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/testjob.jinja2 +0 -0
  491. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/testjobs.jinja2 +0 -0
  492. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/testjobs_progress.jinja2 +0 -0
  493. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/tests-details-nav.jinja2 +0 -0
  494. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/tests.jinja2 +0 -0
  495. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/user_settings/api_token.jinja2 +0 -0
  496. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/user_settings/base.jinja2 +0 -0
  497. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/user_settings/profile.jinja2 +0 -0
  498. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/user_settings/projects.jinja2 +0 -0
  499. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/user_settings/subscriptions.jinja2 +0 -0
  500. {squad-1.89 → squad-1.90}/squad/frontend/templates/squad/user_settings/user_preferences.jinja2 +0 -0
  501. {squad-1.89 → squad-1.90}/squad/frontend/templatetags/__init__.py +0 -0
  502. {squad-1.89 → squad-1.90}/squad/frontend/templatetags/squad.py +0 -0
  503. {squad-1.89 → squad-1.90}/squad/frontend/tests.py +0 -0
  504. {squad-1.89 → squad-1.90}/squad/frontend/urls.py +0 -0
  505. {squad-1.89 → squad-1.90}/squad/frontend/user_settings.py +0 -0
  506. {squad-1.89 → squad-1.90}/squad/frontend/utils.py +0 -0
  507. {squad-1.89 → squad-1.90}/squad/frontend/views.py +0 -0
  508. {squad-1.89 → squad-1.90}/squad/http.py +0 -0
  509. {squad-1.89 → squad-1.90}/squad/jinja2.py +0 -0
  510. {squad-1.89 → squad-1.90}/squad/mail.py +0 -0
  511. {squad-1.89 → squad-1.90}/squad/manage.py +0 -0
  512. {squad-1.89 → squad-1.90}/squad/plugins/__init__.py +0 -0
  513. {squad-1.89 → squad-1.90}/squad/plugins/example.py +0 -0
  514. {squad-1.89 → squad-1.90}/squad/plugins/gerrit.py +0 -0
  515. {squad-1.89 → squad-1.90}/squad/plugins/github.py +0 -0
  516. {squad-1.89 → squad-1.90}/squad/run/__init__.py +0 -0
  517. {squad-1.89 → squad-1.90}/squad/run/__main__.py +0 -0
  518. {squad-1.89 → squad-1.90}/squad/run/listener.py +0 -0
  519. {squad-1.89 → squad-1.90}/squad/run/scheduler.py +0 -0
  520. {squad-1.89 → squad-1.90}/squad/run/worker.py +0 -0
  521. {squad-1.89 → squad-1.90}/squad/socialaccount.py +0 -0
  522. {squad-1.89 → squad-1.90}/squad/urls.py +0 -0
  523. {squad-1.89 → squad-1.90}/squad/wsgi.py +0 -0
  524. {squad-1.89 → squad-1.90}/squad.egg-info/dependency_links.txt +0 -0
  525. {squad-1.89 → squad-1.90}/squad.egg-info/requires.txt +0 -0
  526. {squad-1.89 → squad-1.90}/squad.egg-info/top_level.txt +0 -0
  527. {squad-1.89 → squad-1.90}/squad.svg +0 -0
  528. {squad-1.89 → squad-1.90}/test/__init__.py +0 -0
  529. {squad-1.89 → squad-1.90}/test/api/__init__.py +0 -0
  530. {squad-1.89 → squad-1.90}/test/api/benchmarks.csv +0 -0
  531. {squad-1.89 → squad-1.90}/test/api/benchmarks.json +0 -0
  532. {squad-1.89 → squad-1.90}/test/api/definition.yaml +0 -0
  533. {squad-1.89 → squad-1.90}/test/api/metadata.json +0 -0
  534. {squad-1.89 → squad-1.90}/test/api/test_ci.py +0 -0
  535. {squad-1.89 → squad-1.90}/test/api/test_data.py +0 -0
  536. {squad-1.89 → squad-1.90}/test/api/test_rest.py +0 -0
  537. {squad-1.89 → squad-1.90}/test/api/test_run.log +0 -0
  538. {squad-1.89 → squad-1.90}/test/api/tests.csv +0 -0
  539. {squad-1.89 → squad-1.90}/test/api/tests.json +0 -0
  540. {squad-1.89 → squad-1.90}/test/api/tests.py +0 -0
  541. {squad-1.89 → squad-1.90}/test/api/tests_log.json +0 -0
  542. {squad-1.89 → squad-1.90}/test/api/tests_two.json +0 -0
  543. {squad-1.89 → squad-1.90}/test/api/twoline_definition.yaml +0 -0
  544. {squad-1.89 → squad-1.90}/test/ci/__init__.py +0 -0
  545. {squad-1.89 → squad-1.90}/test/ci/backend/__init__.py +0 -0
  546. {squad-1.89 → squad-1.90}/test/ci/backend/example-broken-log.yaml +0 -0
  547. {squad-1.89 → squad-1.90}/test/ci/backend/example-lava-log.yaml +0 -0
  548. {squad-1.89 → squad-1.90}/test/ci/backend/lava.json +0 -0
  549. {squad-1.89 → squad-1.90}/test/ci/backend/test_fake.py +0 -0
  550. {squad-1.89 → squad-1.90}/test/ci/backend/test_lava.py +0 -0
  551. {squad-1.89 → squad-1.90}/test/ci/backend/test_real_lava.py +0 -0
  552. {squad-1.89 → squad-1.90}/test/ci/backend/test_tuxsuite.py +0 -0
  553. {squad-1.89 → squad-1.90}/test/ci/backend/tuxsuite_test_failed_result_sample.json +0 -0
  554. {squad-1.89 → squad-1.90}/test/ci/backend/tuxsuite_test_result_sample.json +0 -0
  555. {squad-1.89 → squad-1.90}/test/ci/test_listen.py +0 -0
  556. {squad-1.89 → squad-1.90}/test/ci/test_models.py +0 -0
  557. {squad-1.89 → squad-1.90}/test/ci/test_tasks.py +0 -0
  558. {squad-1.89 → squad-1.90}/test/core/__init__.py +0 -0
  559. {squad-1.89 → squad-1.90}/test/core/test_attachment.py +0 -0
  560. {squad-1.89 → squad-1.90}/test/core/test_build.py +0 -0
  561. {squad-1.89 → squad-1.90}/test/core/test_build_summary.py +0 -0
  562. {squad-1.89 → squad-1.90}/test/core/test_callback.py +0 -0
  563. {squad-1.89 → squad-1.90}/test/core/test_emailtemplate.py +0 -0
  564. {squad-1.89 → squad-1.90}/test/core/test_failures.py +0 -0
  565. {squad-1.89 → squad-1.90}/test/core/test_group.py +0 -0
  566. {squad-1.89 → squad-1.90}/test/core/test_historical_emailtemplate.py +0 -0
  567. {squad-1.89 → squad-1.90}/test/core/test_history.py +0 -0
  568. {squad-1.89 → squad-1.90}/test/core/test_import_data.py +0 -0
  569. {squad-1.89 → squad-1.90}/test/core/test_import_data_input/1/default/1/metadata.json +0 -0
  570. {squad-1.89 → squad-1.90}/test/core/test_import_data_input/1/default/1/metrics.json +0 -0
  571. {squad-1.89 → squad-1.90}/test/core/test_import_data_input/2/default/2/metadata.json +0 -0
  572. {squad-1.89 → squad-1.90}/test/core/test_import_data_input/2/default/2/metrics.json +0 -0
  573. {squad-1.89 → squad-1.90}/test/core/test_import_data_input/2/default/2/screenshot.png +0 -0
  574. {squad-1.89 → squad-1.90}/test/core/test_import_data_input/2/default/2/tests.json +0 -0
  575. {squad-1.89 → squad-1.90}/test/core/test_import_data_missing_metadata/1/1/tests.json +0 -0
  576. {squad-1.89 → squad-1.90}/test/core/test_known_issues.py +0 -0
  577. {squad-1.89 → squad-1.90}/test/core/test_metric.py +0 -0
  578. {squad-1.89 → squad-1.90}/test/core/test_metric_comparison.py +0 -0
  579. {squad-1.89 → squad-1.90}/test/core/test_metric_threshold.py +0 -0
  580. {squad-1.89 → squad-1.90}/test/core/test_metrics_data.py +0 -0
  581. {squad-1.89 → squad-1.90}/test/core/test_metrics_summary.py +0 -0
  582. {squad-1.89 → squad-1.90}/test/core/test_notification.py +0 -0
  583. {squad-1.89 → squad-1.90}/test/core/test_notification_delivery.py +0 -0
  584. {squad-1.89 → squad-1.90}/test/core/test_patch_source.py +0 -0
  585. {squad-1.89 → squad-1.90}/test/core/test_project.py +0 -0
  586. {squad-1.89 → squad-1.90}/test/core/test_project_status.py +0 -0
  587. {squad-1.89 → squad-1.90}/test/core/test_statistics.py +0 -0
  588. {squad-1.89 → squad-1.90}/test/core/test_tasks.py +0 -0
  589. {squad-1.89 → squad-1.90}/test/core/test_tasks_notification.py +0 -0
  590. {squad-1.89 → squad-1.90}/test/core/test_test.py +0 -0
  591. {squad-1.89 → squad-1.90}/test/core/test_test_comparison.py +0 -0
  592. {squad-1.89 → squad-1.90}/test/core/test_test_data.py +0 -0
  593. {squad-1.89 → squad-1.90}/test/core/test_test_run.py +0 -0
  594. {squad-1.89 → squad-1.90}/test/core/test_test_summary.py +0 -0
  595. {squad-1.89 → squad-1.90}/test/core/test_update_project_statuses.py +0 -0
  596. {squad-1.89 → squad-1.90}/test/core/test_user_namespace.py +0 -0
  597. {squad-1.89 → squad-1.90}/test/core/test_utils.py +0 -0
  598. {squad-1.89 → squad-1.90}/test/frontend/__init__.py +0 -0
  599. {squad-1.89 → squad-1.90}/test/frontend/test_basics.py +0 -0
  600. {squad-1.89 → squad-1.90}/test/frontend/test_comparison.py +0 -0
  601. {squad-1.89 → squad-1.90}/test/frontend/test_get_token_command.py +0 -0
  602. {squad-1.89 → squad-1.90}/test/frontend/test_group_settings.py +0 -0
  603. {squad-1.89 → squad-1.90}/test/frontend/test_history.py +0 -0
  604. {squad-1.89 → squad-1.90}/test/frontend/test_template_tags.py +0 -0
  605. {squad-1.89 → squad-1.90}/test/frontend/test_test_job.py +0 -0
  606. {squad-1.89 → squad-1.90}/test/frontend/test_tests.py +0 -0
  607. {squad-1.89 → squad-1.90}/test/frontend/test_utils.py +0 -0
  608. {squad-1.89 → squad-1.90}/test/integration/__init__.py +0 -0
  609. {squad-1.89 → squad-1.90}/test/integration/plugins/test_tradefed.py +0 -0
  610. {squad-1.89 → squad-1.90}/test/integration/plugins/tradefed-output-20220608105250.tar.xz +0 -0
  611. {squad-1.89 → squad-1.90}/test/integration/test_build_notification_from_ci.py +0 -0
  612. {squad-1.89 → squad-1.90}/test/javascript.py +0 -0
  613. {squad-1.89 → squad-1.90}/test/karma.conf.js +0 -0
  614. {squad-1.89 → squad-1.90}/test/mock.py +0 -0
  615. {squad-1.89 → squad-1.90}/test/performance.py +0 -0
  616. {squad-1.89 → squad-1.90}/test/plugins/__init__.py +0 -0
  617. {squad-1.89 → squad-1.90}/test/plugins/linux_log_parser/kasan.log +0 -0
  618. {squad-1.89 → squad-1.90}/test/plugins/linux_log_parser/kernel_bug_and_invalid_opcode.log +0 -0
  619. {squad-1.89 → squad-1.90}/test/plugins/linux_log_parser/kernelexceptiontrace.log +0 -0
  620. {squad-1.89 → squad-1.90}/test/plugins/linux_log_parser/kernelexceptiontrace_without_squarebraces.log +0 -0
  621. {squad-1.89 → squad-1.90}/test/plugins/linux_log_parser/kernelpanic.log +0 -0
  622. {squad-1.89 → squad-1.90}/test/plugins/linux_log_parser/kfence.log +0 -0
  623. {squad-1.89 → squad-1.90}/test/plugins/linux_log_parser/multiple_issues_dmesg.log +0 -0
  624. {squad-1.89 → squad-1.90}/test/plugins/linux_log_parser/oops.log +0 -0
  625. {squad-1.89 → squad-1.90}/test/plugins/linux_log_parser/rcu_warning.log +0 -0
  626. {squad-1.89 → squad-1.90}/test/plugins/test_gerrit.py +0 -0
  627. {squad-1.89 → squad-1.90}/test/plugins/test_github.py +0 -0
  628. {squad-1.89 → squad-1.90}/test/plugins/test_linux_log_parser.py +0 -0
  629. {squad-1.89 → squad-1.90}/test/plugins/test_plugin.py +0 -0
  630. {squad-1.89 → squad-1.90}/test/settings.py +0 -0
  631. {squad-1.89 → squad-1.90}/test/test_architecture.py +0 -0
  632. {squad-1.89 → squad-1.90}/test/test_code_quality.py +0 -0
  633. {squad-1.89 → squad-1.90}/test/test_cors.py +0 -0
  634. {squad-1.89 → squad-1.90}/test/test_i18n.py +0 -0
  635. {squad-1.89 → squad-1.90}/test/test_mail.py +0 -0
  636. {squad-1.89 → squad-1.90}/test/test_pending_migrations.py +0 -0
  637. {squad-1.89 → squad-1.90}/test/unit/test_annotation.js +0 -0
  638. {squad-1.89 → squad-1.90}/test/unit/test_cancel.js +0 -0
  639. {squad-1.89 → squad-1.90}/test/unit/test_charts.js +0 -0
  640. {squad-1.89 → squad-1.90}/test/unit/test_compare.js +0 -0
  641. {squad-1.89 → squad-1.90}/test/unit/test_filter.js +0 -0
  642. {squad-1.89 → squad-1.90}/test/unit/test_resubmit.js +0 -0
@@ -1,3 +1,10 @@
1
+ # 1.90
2
+
3
+ This 1.90 release makes linux-log-parser more plugable, meaning that it could be
4
+ moved away from SQUAD into its separate package.
5
+
6
+ This release also improves performance when uploading testrun attachments.
7
+
1
8
  # 1.89
2
9
 
3
10
  This 1.89 release comes with quite several changes:
@@ -21,7 +21,6 @@ include .mailmap
21
21
  include .readthedocs.yml
22
22
  include .coveragerc
23
23
  include squad.svg
24
- include .github/workflows/*.yml
25
24
  include test/integration/plugins/tradefed-output-20220608105250.tar.xz
26
25
 
27
26
  include squad/core/management/commands/import_data.rst
@@ -37,6 +36,7 @@ recursive-include .reuse/ *
37
36
  include babel.cfg
38
37
  recursive-include squad/ *.mo *.po *.pot
39
38
 
39
+ exclude .gitlab-ci.yml
40
40
  exclude squad/local_settings.py
41
41
  exclude squad/local_settings.py.off
42
42
  recursive-exclude squad/frontend/static/vendor/ *
squad-1.90/PKG-INFO ADDED
@@ -0,0 +1,14 @@
1
+ Metadata-Version: 2.1
2
+ Name: squad
3
+ Version: 1.90
4
+ Summary: Software Quality Dashboard
5
+ Home-page: https://github.com/Linaro/squad
6
+ Author: Antonio Terceiro
7
+ Author-email: antonio.terceiro@linaro.org
8
+ License: GPLv3+
9
+ Platform: any
10
+ Provides-Extra: postgres
11
+ License-File: COPYING
12
+
13
+ Software Quality Dashboard
14
+
@@ -8,6 +8,20 @@ tmpdir="$basedir"/tmp
8
8
  datadir="$tmpdir"/data
9
9
  mkdir -p "$datadir"
10
10
 
11
+ has_input=
12
+ TTY="-i"
13
+ if [ -t 1 ];
14
+ then
15
+ TTY="-it"
16
+ has_input=yes
17
+ fi
18
+
19
+ user=squad
20
+ if [ ! -z "${USER-}" ]
21
+ then
22
+ user=${USER}
23
+ fi
24
+
11
25
  dockerfile="$datadir"/../Dockerfile.dev
12
26
  (
13
27
  sed -e '1,/# Prepare the environment/!d' "$basedir"/Dockerfile
@@ -25,11 +39,16 @@ dockerfile="$datadir"/../Dockerfile.dev
25
39
  nodejs \
26
40
  ruby-foreman \
27
41
  procps && \'
28
- echo " groupadd -g $(id -g) $(id -gn) && \\"
29
- echo " useradd -m -u $(id -u) -g $(id -g) -s /bin/bash ${USER}"
30
- echo "RUN pip3 install --no-dependencies django-bootstrap3"
42
+ echo " pip3 install --no-dependencies django-bootstrap3"
43
+
44
+ if [ ! -z "${has_input}" ]
45
+ then
46
+ echo "RUN groupadd -g $(id -g) $(id -gn) && \\"
47
+ echo " useradd -m -u $(id -u) -g $(id -g) -s /bin/bash ${user}"
48
+ echo "USER ${user}"
49
+ fi
50
+
31
51
  echo "WORKDIR /app"
32
- echo "USER ${USER}"
33
52
  echo 'CMD ["bash"]'
34
53
  ) > "$dockerfile"
35
54
 
@@ -44,12 +63,6 @@ for v in $HOME/.gitconfig $HOME/.config/git; do
44
63
  fi
45
64
  done
46
65
 
47
- TTY="-i"
48
- if [ -t 1 ];
49
- then
50
- TTY="-it"
51
- fi
52
-
53
66
  PORT=${PORT:-8000}
54
67
 
55
68
  exec docker run \
@@ -23,11 +23,8 @@ cleanup() {
23
23
  mv "$local_settings".off "$local_settings"
24
24
  fi
25
25
  }
26
- git ls-tree -r --name-only HEAD | grep -v '\.tar$' | sort > "$git"
26
+ git ls-tree -r --name-only HEAD | grep -v '\(\.tar\|\.gitlab-ci.yml\)$' | sort > "$git"
27
27
 
28
28
  downloads=$(awk '{ if ($1 && $1 !~ /^#/) { print($1)} }' squad/frontend/static/download.conf | xargs printf '%s\|')
29
29
  tar taf dist/squad-${v}.tar.gz | cut -d / -f 2- | grep -v '\(/$\|^$\|PKG-INFO\|egg-info\|static\/\('$downloads'download.status\)\|.mo$\)' | sort > "$tar"
30
30
  diff -u "$tar" "$git"
31
-
32
- # Build docker container
33
- docker build -t squadproject/squad:$v .
@@ -40,10 +40,13 @@ if [ "${TEST:-yes}" != "no" ]; then
40
40
  ./dev-docker ./manage.py test
41
41
  fi
42
42
 
43
- # Build squad pip package and docker container
43
+ # Check squad pip package build
44
44
  ./scripts/build "v$v"
45
45
  rm -rf build/ dist/ *.egg-info/
46
46
 
47
+ # Check docker container build
48
+ docker build -t squadproject/squad:$v .
49
+
47
50
  # Commit changes and push the new tag
48
51
  git commit --message "New release: ${v}" CHANGELOG.md squad/version.py || true
49
52
  git tag -s -m "SQUAD release $v" "v$v"
@@ -105,7 +105,7 @@ def add_test_run(request, group_slug, project_slug, version, environment_slug):
105
105
  if 'attachment' in request.FILES:
106
106
  attachments = {}
107
107
  for f in request.FILES.getlist('attachment'):
108
- attachments[f.name] = read_file_upload(f)
108
+ attachments[f.name] = f
109
109
  test_run_data['attachments'] = attachments
110
110
 
111
111
  receive = ReceiveTestRun(project)
@@ -2,6 +2,7 @@ from glob import glob
2
2
  import os
3
3
  import re
4
4
  from django.core.management.base import BaseCommand
5
+ from django.core.files import File
5
6
 
6
7
 
7
8
  from squad.core.models import Build
@@ -123,7 +124,7 @@ class Command(BaseCommand):
123
124
  for f in glob(os.path.join(directory, '*')):
124
125
  name = os.path.basename(f)
125
126
  if name not in ['metrics.json', 'metadata.json', 'tests.json']:
126
- attachments[name] = open(f, 'rb').read()
127
+ attachments[name] = File(open(f, 'rb'))
127
128
 
128
129
  if not self.options['silent']:
129
130
  print("Importing test run: %s" % directory)
@@ -909,8 +909,8 @@ class Attachment(models.Model):
909
909
  self.__data__ = b''
910
910
  return self.__data__
911
911
 
912
- def save_file(self, filename, contents):
913
- storage_save(self, self.storage, filename, contents)
912
+ def save_file(self, filename, file):
913
+ storage_save(self, self.storage, filename, file)
914
914
 
915
915
 
916
916
  class SuiteMetadata(models.Model):
@@ -172,9 +172,9 @@ class ReceiveTestRun(object):
172
172
  if log_file is not None:
173
173
  testrun.save_log_file(log_file)
174
174
 
175
- for filename, data in attachments.items():
176
- attachment = testrun.attachments.create(filename=filename, length=len(data))
177
- attachment.save_file(filename, data)
175
+ for filename, file in attachments.items():
176
+ attachment = testrun.attachments.create(filename=filename, length=file.size)
177
+ attachment.save_file(filename, file)
178
178
 
179
179
  testrun.refresh_from_db()
180
180
 
@@ -169,8 +169,11 @@ def log_deletion(request, object, message):
169
169
 
170
170
 
171
171
  def storage_save(obj, storage_field, filename, content):
172
- content_bytes = content or ''
173
- if type(content_bytes) is str:
174
- content_bytes = content_bytes.encode()
175
172
  filename = '%s/%s/%s' % (obj.__class__.__name__.lower(), obj.pk, filename)
176
- storage_field.save(filename, ContentFile(content_bytes))
173
+ if type(content) in [bytes, str]:
174
+ content_bytes = content or ''
175
+ if type(content_bytes) is str:
176
+ content_bytes = content_bytes.encode()
177
+ storage_field.save(filename, ContentFile(content_bytes))
178
+ else:
179
+ storage_field.save(filename, content)
@@ -0,0 +1 @@
1
+ from squad.plugins import Plugin # noqa
@@ -0,0 +1,152 @@
1
+ import hashlib
2
+ import re
3
+ from collections import defaultdict
4
+
5
+ from django.template.defaultfilters import slugify
6
+
7
+ REGEX_NAME = 0
8
+ REGEX_BODY = 1
9
+ REGEX_EXTRACT_NAME = 2
10
+
11
+
12
+ class BaseLogParser:
13
+ def compile_regexes(self, regexes):
14
+ combined = [r"(%s)" % r[REGEX_BODY] for r in regexes]
15
+ return re.compile(r"|".join(combined), re.S | re.M)
16
+
17
+ def remove_numbers_and_time(self, snippet):
18
+ without_numbers = re.sub(r"(0x[a-f0-9]+|[<\[][0-9a-f]+?[>\]]|\d+)", "", snippet)
19
+ without_time = re.sub(r"^\[[^\]]+\]", "", without_numbers)
20
+
21
+ return without_time
22
+
23
+ def create_name(self, snippet, compiled_regex=None):
24
+ matches = None
25
+ if compiled_regex:
26
+ matches = compiled_regex.findall(snippet)
27
+ if not matches:
28
+ # Only extract a name if we provide a regex to extract the name and
29
+ # there is a match
30
+ return None
31
+ snippet = matches[0]
32
+ without_numbers_and_time = self.remove_numbers_and_time(snippet)
33
+
34
+ # Limit the name length to 191 characters, since the max name length
35
+ # for SuiteMetadata in SQUAD is 256 characters. The SHA and "-" take 65
36
+ # characters: 256-65=191
37
+ return slugify(without_numbers_and_time)[:191]
38
+
39
+ def create_shasum(self, snippet):
40
+ sha = hashlib.sha256()
41
+ without_numbers_and_time = self.remove_numbers_and_time(snippet)
42
+ sha.update(without_numbers_and_time.encode())
43
+ return sha.hexdigest()
44
+
45
+ def create_name_log_dict(self, test_name, lines, test_regex=None):
46
+ """
47
+ Produce a dictionary with the test names as keys and the extracted logs
48
+ for that test name as values. There will be at least one test name per
49
+ regex. If there were any matches for a given regex, then a new test
50
+ will be generated using test_name + shasum.
51
+ """
52
+ # Run the REGEX_EXTRACT_NAME regex over the log lines to sort them by
53
+ # extracted name. If no name is extracted or the log parser did not
54
+ # have any output for a particular regex, just use the default name
55
+ # (for example "check-kernel-oops").
56
+ tests_without_shas_to_create = defaultdict(set)
57
+ tests_with_shas_to_create = defaultdict(set)
58
+
59
+ # If there are no lines, use the default name and create a passing
60
+ # test. For example "check-kernel-oops"
61
+ if not lines:
62
+ tests_without_shas_to_create[test_name] = []
63
+
64
+ # If there are lines, then create the tests for these.
65
+ for line in lines:
66
+ extracted_name = self.create_name(line, test_regex)
67
+ if extracted_name:
68
+ extended_test_name = f"{test_name}-{extracted_name}"
69
+ else:
70
+ extended_test_name = test_name
71
+ tests_without_shas_to_create[extended_test_name].add(line)
72
+
73
+ for name, test_lines in tests_without_shas_to_create.items():
74
+ # Some lines of the matched regex might be the same, and we don't want to create
75
+ # multiple tests like test1-sha1, test1-sha1, etc, so we'll create a set of sha1sums
76
+ # then create only new tests for unique sha's
77
+
78
+ for line in test_lines:
79
+ sha = self.create_shasum(line)
80
+ name_with_sha = f"{name}-{sha}"
81
+ tests_with_shas_to_create[name_with_sha].add(line)
82
+
83
+ return tests_without_shas_to_create, tests_with_shas_to_create
84
+
85
+ def create_squad_tests_from_name_log_dict(
86
+ self, suite, testrun, tests_without_shas_to_create, tests_with_shas_to_create
87
+ ):
88
+ # Import SuiteMetadata from SQUAD only when required so BaseLogParser
89
+ # does not require a SQUAD to work. This makes it easier to reuse this
90
+ # class outside of SQUAD for testing and developing log parser
91
+ # patterns.
92
+ from squad.core.models import SuiteMetadata
93
+
94
+ for name, lines in tests_without_shas_to_create.items():
95
+ metadata, _ = SuiteMetadata.objects.get_or_create(
96
+ suite=suite.slug, name=name, kind="test"
97
+ )
98
+ testrun.tests.create(
99
+ suite=suite,
100
+ result=(len(lines) == 0),
101
+ log="\n".join(lines),
102
+ metadata=metadata,
103
+ build=testrun.build,
104
+ environment=testrun.environment,
105
+ )
106
+ for name_with_sha, lines in tests_with_shas_to_create.items():
107
+ metadata, _ = SuiteMetadata.objects.get_or_create(
108
+ suite=suite.slug, name=name_with_sha, kind="test"
109
+ )
110
+ testrun.tests.create(
111
+ suite=suite,
112
+ result=False,
113
+ log="\n---\n".join(lines),
114
+ metadata=metadata,
115
+ build=testrun.build,
116
+ environment=testrun.environment,
117
+ )
118
+
119
+ def create_squad_tests(self, testrun, suite, test_name, lines, test_regex=None):
120
+ """
121
+ There will be at least one test per regex. If there were any match for
122
+ a given regex, then a new test will be generated using test_name +
123
+ shasum. This helps comparing kernel logs across different builds
124
+ """
125
+ tests_without_shas_to_create, tests_with_shas_to_create = (
126
+ self.create_name_log_dict(test_name, lines, test_regex)
127
+ )
128
+ self.create_squad_tests_from_name_log_dict(
129
+ suite,
130
+ testrun,
131
+ tests_without_shas_to_create,
132
+ tests_with_shas_to_create,
133
+ )
134
+
135
+ def join_matches(self, matches, regexes):
136
+ """
137
+ group regex in python are returned as a list of tuples which each
138
+ group match in one of the positions in the tuple. Example:
139
+ regex = r'(a)|(b)|(c)'
140
+ matches = [
141
+ ('match a', '', ''),
142
+ ('', 'match b', ''),
143
+ ('match a', '', ''),
144
+ ('', '', 'match c')
145
+ ]
146
+ """
147
+ snippets = {regex_id: [] for regex_id in range(len(regexes))}
148
+ for match in matches:
149
+ for regex_id in range(len(regexes)):
150
+ if len(match[regex_id]) > 0:
151
+ snippets[regex_id].append(match[regex_id])
152
+ return snippets
@@ -0,0 +1,68 @@
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
5
+
6
+ logger = logging.getLogger()
7
+
8
+ MULTILINERS = [
9
+ ('check-kernel-exception', r'-+\[? cut here \]?-+.*?-+\[? end trace \w* \]?-+', r"\d][^\+\n]*"),
10
+ ('check-kernel-kasan', r'=+\n\[[\s\.\d]+\]\s+BUG: KASAN:.*?=+', r"BUG: KASAN:[^\+\n]*"),
11
+ ('check-kernel-kfence', r'=+\n\[[\s\.\d]+\]\s+BUG: KFENCE:.*?=+', r"BUG: KFENCE:[^\+\n]*"),
12
+ ]
13
+
14
+ ONELINERS = [
15
+ ('check-kernel-oops', r'^[^\n]+Oops(?: -|:).*?$', r"Oops[^\+\n]*"),
16
+ ('check-kernel-fault', r'^[^\n]+Unhandled fault.*?$', r"Unhandled [^\+\n]*"),
17
+ ('check-kernel-warning', r'^[^\n]+WARNING:.*?$', r"WARNING: [^\+\n]*"),
18
+ ('check-kernel-bug', r'^[^\n]+(?: kernel BUG at|BUG:).*?$', r"BUG[^\+\n]*"),
19
+ ('check-kernel-invalid-opcode', r'^[^\n]+invalid opcode:.*?$', r"invalid opcode: [^\+\n]*"),
20
+ ('check-kernel-panic', r'Kernel panic - not syncing.*?$', r"Kernel [^\+\n]*"),
21
+ ]
22
+
23
+ # Tip: broader regexes should come first
24
+ REGEXES = MULTILINERS + ONELINERS
25
+
26
+
27
+ class Plugin(BasePlugin, BaseLogParser):
28
+ def __cutoff_boot_log(self, log):
29
+ # Attempt to split the log in " login:"
30
+ logs = log.split(' login:', 1)
31
+
32
+ # 1 string means no split was done, consider all logs as test log
33
+ if len(logs) == 1:
34
+ return '', log
35
+
36
+ boot_log = logs[0]
37
+ test_log = logs[1]
38
+ return boot_log, test_log
39
+
40
+ def __kernel_msgs_only(self, log):
41
+ kernel_msgs = re.findall(r'(\[[ \d]+\.[ \d]+\] .*?)$', log, re.S | re.M)
42
+ return '\n'.join(kernel_msgs)
43
+
44
+ def postprocess_testrun(self, testrun):
45
+ if testrun.log_file is None:
46
+ return
47
+
48
+ boot_log, test_log = self.__cutoff_boot_log(testrun.log_file)
49
+ logs = {
50
+ 'boot': boot_log,
51
+ 'test': test_log,
52
+ }
53
+
54
+ for log_type, log in logs.items():
55
+ log = self.__kernel_msgs_only(log)
56
+ suite, _ = testrun.build.project.suites.get_or_create(slug=f'log-parser-{log_type}')
57
+
58
+ regex = self.compile_regexes(REGEXES)
59
+ matches = regex.findall(log)
60
+ snippets = self.join_matches(matches, REGEXES)
61
+
62
+ for regex_id in range(len(REGEXES)):
63
+ test_name = REGEXES[regex_id][REGEX_NAME]
64
+ regex_pattern = REGEXES[regex_id][REGEX_EXTRACT_NAME]
65
+ test_name_regex = None
66
+ if regex_pattern:
67
+ test_name_regex = re.compile(regex_pattern, re.S | re.M)
68
+ self.create_squad_tests(testrun, suite, test_name, snippets[regex_id], test_name_regex)
@@ -37,17 +37,21 @@ if not os.access(DATA_DIR, os.W_OK):
37
37
  # See https://docs.djangoproject.com/en/1.9/howto/deployment/checklist/
38
38
 
39
39
  # SECURITY WARNING: keep the secret key used in production secret!
40
- secret_key_file = os.getenv('SECRET_KEY_FILE', None)
41
- if secret_key_file is None:
42
- secret_key_file = os.path.join(DATA_DIR, 'secret.dat')
43
-
44
- if not os.path.exists(secret_key_file):
45
- from squad.core.utils import random_key
46
- fd = os.open(secret_key_file, os.O_WRONLY | os.O_CREAT, 0o600)
47
- with os.fdopen(fd, 'w') as f:
48
- f.write(random_key(64))
49
-
50
- SECRET_KEY = open(secret_key_file).read()
40
+ secret_key = os.getenv('SECRET_KEY', None)
41
+ if secret_key:
42
+ SECRET_KEY = secret_key
43
+ else:
44
+ secret_key_file = os.getenv('SECRET_KEY_FILE', None)
45
+ if secret_key_file is None:
46
+ secret_key_file = os.path.join(DATA_DIR, 'secret.dat')
47
+
48
+ if not os.path.exists(secret_key_file):
49
+ from squad.core.utils import random_key
50
+ fd = os.open(secret_key_file, os.O_WRONLY | os.O_CREAT, 0o600)
51
+ with os.fdopen(fd, 'w') as f:
52
+ f.write(random_key(64))
53
+
54
+ SECRET_KEY = open(secret_key_file).read()
51
55
 
52
56
  DEBUG = os.getenv('ENV') not in ['production', 'staging']
53
57
 
@@ -0,0 +1 @@
1
+ __version__ = '1.90'
@@ -0,0 +1,14 @@
1
+ Metadata-Version: 2.1
2
+ Name: squad
3
+ Version: 1.90
4
+ Summary: Software Quality Dashboard
5
+ Home-page: https://github.com/Linaro/squad
6
+ Author: Antonio Terceiro
7
+ Author-email: antonio.terceiro@linaro.org
8
+ License: GPLv3+
9
+ Platform: any
10
+ Provides-Extra: postgres
11
+ License-File: COPYING
12
+
13
+ Software Quality Dashboard
14
+
@@ -24,8 +24,6 @@ requirements.txt
24
24
  setup.cfg
25
25
  setup.py
26
26
  squad.svg
27
- .github/workflows/release.yml
28
- .github/workflows/test.yml
29
27
  .reuse/dep5
30
28
  LICENSES/GPL-3.0-or-later.txt
31
29
  LICENSES/MIT.txt
@@ -68,7 +66,6 @@ scripts/test-docker
68
66
  scripts/translate
69
67
  scripts/travis-lava
70
68
  scripts/update-translation-files
71
- scripts/upload
72
69
  scripts/community_connector/main.js
73
70
  scripts/community_connector/manifest.json
74
71
  scripts/testdata/gen-ci-jobs
@@ -512,6 +509,8 @@ squad/plugins/example.py
512
509
  squad/plugins/gerrit.py
513
510
  squad/plugins/github.py
514
511
  squad/plugins/linux_log_parser.py
512
+ squad/plugins/lib/__init__.py
513
+ squad/plugins/lib/base_log_parser.py
515
514
  squad/run/__init__.py
516
515
  squad/run/__main__.py
517
516
  squad/run/listener.py
@@ -616,6 +615,7 @@ test/plugins/__init__.py
616
615
  test/plugins/test_gerrit.py
617
616
  test/plugins/test_github.py
618
617
  test/plugins/test_linux_log_parser.py
618
+ test/plugins/test_log_parser_base.py
619
619
  test/plugins/test_plugin.py
620
620
  test/plugins/linux_log_parser/kasan.log
621
621
  test/plugins/linux_log_parser/kernel_bug_and_invalid_opcode.log
@@ -4,3 +4,4 @@ squad-admin = squad.manage:main
4
4
  squad-listener = squad.run.listener:main
5
5
  squad-scheduler = squad.run.scheduler:main
6
6
  squad-worker = squad.run.worker:main
7
+