codecov-cli 11.2.7__tar.gz → 11.3.0__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.
Files changed (193) hide show
  1. {codecov_cli-11.2.7/codecov_cli.egg-info → codecov_cli-11.3.0}/PKG-INFO +10 -10
  2. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/README.md +5 -5
  3. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/commands/upload.py +4 -1
  4. codecov_cli-11.3.0/codecov_cli/fallbacks.py +78 -0
  5. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/helpers/args.py +3 -0
  6. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/helpers/ci_adapters/__init__.py +2 -0
  7. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/helpers/ci_adapters/base.py +8 -0
  8. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/helpers/ci_adapters/github_actions.py +7 -0
  9. codecov_cli-11.3.0/codecov_cli/helpers/ci_adapters/harness.py +52 -0
  10. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/helpers/request.py +1 -1
  11. codecov_cli-11.3.0/codecov_cli/helpers/upload_url_validation.py +21 -0
  12. codecov_cli-11.3.0/codecov_cli/opentelemetry.py +85 -0
  13. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/services/commit/__init__.py +6 -2
  14. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/services/empty_upload/__init__.py +7 -1
  15. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/services/report/__init__.py +13 -5
  16. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/services/upload/__init__.py +1 -1
  17. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/services/upload/upload_sender.py +12 -7
  18. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/services/upload_completion/__init__.py +6 -1
  19. {codecov_cli-11.2.7 → codecov_cli-11.3.0/codecov_cli.egg-info}/PKG-INFO +10 -10
  20. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli.egg-info/SOURCES.txt +3 -0
  21. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli.egg-info/requires.txt +1 -1
  22. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/pyproject.toml +8 -7
  23. codecov_cli-11.3.0/tests/ci_adapters/test_harnessci.py +150 -0
  24. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/commands/test_invoke_upload.py +1 -1
  25. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/factory.py +4 -0
  26. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/helpers/test_ci_adapter_selection.py +4 -0
  27. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/helpers/test_upload_sender.py +54 -17
  28. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/helpers/test_versioning_systems.py +1 -1
  29. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/services/commit/test_commit_service.py +41 -8
  30. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/services/empty_upload/test_empty_upload.py +11 -11
  31. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/services/report/test_report_results.py +15 -15
  32. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/services/report/test_report_service.py +6 -6
  33. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/services/upload/test_upload_service.py +9 -9
  34. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/services/upload_completion/test_upload_completion.py +9 -9
  35. codecov_cli-11.3.0/tests/test_fallbacks.py +93 -0
  36. codecov_cli-11.2.7/codecov_cli/fallbacks.py +0 -56
  37. codecov_cli-11.2.7/codecov_cli/opentelemetry.py +0 -26
  38. codecov_cli-11.2.7/tests/test_fallbacks.py +0 -33
  39. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/LICENSE +0 -0
  40. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/MANIFEST.in +0 -0
  41. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/__init__.py +0 -0
  42. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/branding.py +0 -0
  43. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/commands/__init__.py +0 -0
  44. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/commands/base_picking.py +0 -0
  45. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/commands/commit.py +0 -0
  46. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/commands/create_report_result.py +0 -0
  47. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/commands/empty_upload.py +0 -0
  48. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/commands/get_report_results.py +0 -0
  49. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/commands/labelanalysis.py +0 -0
  50. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/commands/process_test_results.py +0 -0
  51. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/commands/report.py +0 -0
  52. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/commands/send_notifications.py +0 -0
  53. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/commands/staticanalysis.py +0 -0
  54. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/commands/upload_coverage.py +0 -0
  55. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/commands/upload_process.py +0 -0
  56. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/helpers/__init__.py +0 -0
  57. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/helpers/ci_adapters/appveyor_ci.py +0 -0
  58. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/helpers/ci_adapters/azure_pipelines.py +0 -0
  59. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/helpers/ci_adapters/bitbucket_ci.py +0 -0
  60. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/helpers/ci_adapters/bitrise_ci.py +0 -0
  61. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/helpers/ci_adapters/buildkite.py +0 -0
  62. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/helpers/ci_adapters/circleci.py +0 -0
  63. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/helpers/ci_adapters/cirrus_ci.py +0 -0
  64. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/helpers/ci_adapters/cloudbuild.py +0 -0
  65. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/helpers/ci_adapters/codebuild.py +0 -0
  66. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/helpers/ci_adapters/droneci.py +0 -0
  67. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/helpers/ci_adapters/gitlab_ci.py +0 -0
  68. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/helpers/ci_adapters/heroku.py +0 -0
  69. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/helpers/ci_adapters/jenkins.py +0 -0
  70. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/helpers/ci_adapters/local.py +0 -0
  71. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/helpers/ci_adapters/teamcity.py +0 -0
  72. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/helpers/ci_adapters/travis_ci.py +0 -0
  73. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/helpers/ci_adapters/woodpeckerci.py +0 -0
  74. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/helpers/config.py +0 -0
  75. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/helpers/encoder.py +0 -0
  76. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/helpers/folder_searcher.py +0 -0
  77. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/helpers/git.py +0 -0
  78. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/helpers/git_services/__init__.py +0 -0
  79. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/helpers/git_services/github.py +0 -0
  80. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/helpers/glob.py +0 -0
  81. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/helpers/logging_utils.py +0 -0
  82. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/helpers/options.py +0 -0
  83. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/helpers/upload_type.py +0 -0
  84. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/helpers/validators.py +0 -0
  85. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/helpers/versioning_systems.py +0 -0
  86. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/main.py +0 -0
  87. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/plugins/__init__.py +0 -0
  88. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/plugins/compress_pycoverage_contexts.py +0 -0
  89. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/plugins/gcov.py +0 -0
  90. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/plugins/pycoverage.py +0 -0
  91. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/plugins/types.py +0 -0
  92. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/plugins/xcode.py +0 -0
  93. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/runners/__init__.py +0 -0
  94. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/runners/dan_runner.py +0 -0
  95. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/runners/pytest_standard_runner.py +0 -0
  96. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/runners/types.py +0 -0
  97. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/services/__init__.py +0 -0
  98. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/services/commit/base_picking.py +0 -0
  99. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/services/upload/file_finder.py +0 -0
  100. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/services/upload/legacy_upload_sender.py +0 -0
  101. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/services/upload/network_finder.py +0 -0
  102. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/services/upload/upload_collector.py +0 -0
  103. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/services/upload_coverage/__init__.py +0 -0
  104. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli/types.py +0 -0
  105. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli.egg-info/dependency_links.txt +0 -0
  106. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli.egg-info/entry_points.txt +0 -0
  107. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/codecov_cli.egg-info/top_level.txt +0 -0
  108. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/samples/example_cli_config.yml +0 -0
  109. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/samples/example_module.js +0 -0
  110. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/samples/fake_project/.codecov.yaml +0 -0
  111. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/samples/fake_project/.codecov.yml +0 -0
  112. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/samples/fake_project/.github/.codecov.yaml +0 -0
  113. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/samples/fake_project/.github/.codecov.yml +0 -0
  114. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/samples/fake_project/.github/codecov.yaml +0 -0
  115. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/samples/fake_project/.github/codecov.yml +0 -0
  116. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/samples/fake_project/codecov.yaml +0 -0
  117. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/samples/fake_project/codecov.yml +0 -0
  118. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/samples/fake_project/dev/.codecov.yaml +0 -0
  119. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/samples/fake_project/dev/.codecov.yml +0 -0
  120. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/samples/fake_project/dev/codecov.yaml +0 -0
  121. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/samples/fake_project/dev/codecov.yml +0 -0
  122. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/samples/inputs/sample_001.py +0 -0
  123. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/samples/inputs/sample_002.py +0 -0
  124. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/samples/inputs/sample_003.js +0 -0
  125. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/samples/inputs/sample_004.js +0 -0
  126. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/samples/inputs/sample_005.py +0 -0
  127. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/samples/junit.xml +0 -0
  128. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/samples/outputs/sample_001.json +0 -0
  129. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/samples/outputs/sample_002.json +0 -0
  130. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/samples/outputs/sample_003.json +0 -0
  131. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/samples/outputs/sample_004.json +0 -0
  132. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/samples/outputs/sample_005.json +0 -0
  133. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/setup.cfg +0 -0
  134. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/setup.py +0 -0
  135. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/__init__.py +0 -0
  136. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/ci_adapters/test_appveyor.py +0 -0
  137. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/ci_adapters/test_azure_pipelines.py +0 -0
  138. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/ci_adapters/test_bitbucket_ci.py +0 -0
  139. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/ci_adapters/test_bitrise.py +0 -0
  140. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/ci_adapters/test_buildkite.py +0 -0
  141. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/ci_adapters/test_circleci.py +0 -0
  142. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/ci_adapters/test_cirrusci.py +0 -0
  143. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/ci_adapters/test_cloudbuild.py +0 -0
  144. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/ci_adapters/test_codebuild.py +0 -0
  145. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/ci_adapters/test_droneci.py +0 -0
  146. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/ci_adapters/test_ghactions.py +0 -0
  147. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/ci_adapters/test_gitlabci.py +0 -0
  148. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/ci_adapters/test_herokuci.py +0 -0
  149. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/ci_adapters/test_jenkins.py +0 -0
  150. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/ci_adapters/test_local.py +0 -0
  151. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/ci_adapters/test_teamcity.py +0 -0
  152. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/ci_adapters/test_travis_ci.py +0 -0
  153. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/ci_adapters/test_woodpeckerci.py +0 -0
  154. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/commands/__init__.py +0 -0
  155. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/commands/test_invoke_empty_upload.py +0 -0
  156. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/commands/test_invoke_labelanalysis.py +0 -0
  157. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/commands/test_invoke_upload_coverage.py +0 -0
  158. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/commands/test_invoke_upload_process.py +0 -0
  159. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/commands/test_process_test_results.py +0 -0
  160. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/commands/test_upload_token_discovery.py +0 -0
  161. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/conftest.py +0 -0
  162. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/data/files_to_fix_examples/bad_encoding.go +0 -0
  163. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/data/files_to_fix_examples/sample.cpp +0 -0
  164. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/data/files_to_fix_examples/sample.go +0 -0
  165. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/data/files_to_fix_examples/sample.kt +0 -0
  166. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/data/files_to_fix_examples/sample.php +0 -0
  167. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/data/reports_examples.py +0 -0
  168. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/data//320/232/320/276/320/275/321/202/321/200/320/276/320/273/320/273/320/265/321/200/321/213//320/237/320/276/320/273/321/214/320/267/320/276/320/262/320/260/321/202/320/265/320/273/321/214//320/223/320/273/320/260/320/262/320/275/321/213/320/271/320/232/320/276/320/275/321/202/321/200/320/276/320/273/320/273/320/265/321/200.php" +0 -0
  169. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/helpers/git_services/test_github.py +0 -0
  170. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/helpers/test_args.py +0 -0
  171. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/helpers/test_config.py +0 -0
  172. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/helpers/test_encoder.py +0 -0
  173. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/helpers/test_folder_searcher.py +0 -0
  174. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/helpers/test_git.py +0 -0
  175. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/helpers/test_legacy_upload_sender.py +0 -0
  176. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/helpers/test_network_finder.py +0 -0
  177. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/helpers/test_request.py +0 -0
  178. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/helpers/test_validators.py +0 -0
  179. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/plugins/test_compress_pycoverage_contexts.py +0 -0
  180. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/plugins/test_gcov.py +0 -0
  181. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/plugins/test_instantiation.py +0 -0
  182. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/plugins/test_pycoverage.py +0 -0
  183. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/plugins/test_xcode.py +0 -0
  184. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/runners/test_dan_runner.py +0 -0
  185. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/runners/test_pytest_standard_runner.py +0 -0
  186. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/runners/test_runners.py +0 -0
  187. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/runners/test_types.py +0 -0
  188. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/services/commit/test_base_picking.py +0 -0
  189. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/services/upload/test_coverage_file_finder.py +0 -0
  190. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/services/upload/test_upload_collector.py +0 -0
  191. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/test_codecov_cli.py +0 -0
  192. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/test_helpers.py +0 -0
  193. {codecov_cli-11.2.7 → codecov_cli-11.3.0}/tests/test_types.py +0 -0
@@ -1,29 +1,29 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codecov-cli
3
- Version: 11.2.7
3
+ Version: 11.3.0
4
4
  Summary: Codecov Command Line Interface
5
5
  Author-email: Tom Hu <thomas.hu@sentry.io>
6
6
  Maintainer-email: Codecov Support <support@codecov.io>
7
7
  Project-URL: Homepage, https://about.codecov.io
8
- Project-URL: CI: GitHub, https://github.com/getsentry/prevent-cli/actions/workflows/ci.yml
8
+ Project-URL: CI: GitHub, https://github.com/codecov/codecov-cli/actions/workflows/ci.yml
9
9
  Project-URL: Docs, https://docs.codecov.com
10
- Project-URL: GitHub: issues, https://github.com/getsentry/prevent-cli/issues
11
- Project-URL: GitHub: repo, https://github.com/getsentry/prevent-cli
10
+ Project-URL: GitHub: issues, https://github.com/codecov/codecov-cli/issues
11
+ Project-URL: GitHub: repo, https://github.com/codecov/codecov-cli
12
12
  Requires-Python: >=3.9
13
13
  Description-Content-Type: text/markdown
14
14
  License-File: LICENSE
15
15
  Requires-Dist: click<8.3.0,>=8.0.0
16
16
  Requires-Dist: ijson==3.*
17
17
  Requires-Dist: PyYAML==6.*
18
- Requires-Dist: responses==0.21.*
18
+ Requires-Dist: requests>=2.25.0
19
19
  Requires-Dist: sentry-sdk==2.*
20
20
  Requires-Dist: test-results-parser==0.6.1
21
21
  Dynamic: license-file
22
22
 
23
23
  # CodecovCLI
24
24
 
25
- [![codecov](https://codecov.io/github/getsentry/prevent-cli/graph/badge.svg?token=K1xQn7DaxT)](https://codecov.io/github/getsentry/prevent-cli)
26
- [![Build-Test-Upload](https://github.com/getsentry/prevent-cli/actions/workflows/ci.yml/badge.svg)](https://github.com/getsentry/prevent-cli/actions/workflows/ci.yml)
25
+ [![codecov](https://codecov.io/github/codecov/codecov-cli/graph/badge.svg?token=K1xQn7DaxT)](https://codecov.io/github/codecov/codecov-cli)
26
+ [![Build-Test-Upload](https://github.com/codecov/codecov-cli/actions/workflows/ci.yml/badge.svg)](https://github.com/codecov/codecov-cli/actions/workflows/ci.yml)
27
27
 
28
28
  CodecovCLI is a new way for users to interact with Codecov directly from the user’s terminal or CI platform. Many Codecov features that require the user’s interference can be done via the codecovCLI. It saves commits, creates reports, uploads coverage and has many more features.
29
29
 
@@ -63,7 +63,7 @@ The above command will download the latest version of Codecov-cli. If you wish t
63
63
  Note: If you're installing in a `pyenv` environment, you may need to call `pyenv rehash` before the CLI will work.
64
64
 
65
65
  ## As a Binary
66
- If you would like to use the CLI in an environment that does not have access to Python / PIP, you can install the CLI as a compiled binary. Linux and macOS releases can be found [here](https://cli.codecov.io/), along with SHASUMs and signatures for each released version. Binary releases are also available via [Github releases](https://github.com/getsentry/prevent-cli/releases) on this repository.
66
+ If you would like to use the CLI in an environment that does not have access to Python / PIP, you can install the CLI as a compiled binary. Linux and macOS releases can be found [here](https://cli.codecov.io/), along with SHASUMs and signatures for each released version. Binary releases are also available via [Github releases](https://github.com/codecov/codecov-cli/releases) on this repository.
67
67
 
68
68
  You can retrieve the Binary for Linux directly from your command line as follows:
69
69
 
@@ -78,7 +78,7 @@ sudo chmod +x codecov
78
78
  The binary can be integrity checked using a SHASUM256 and SHASUM256.sig file. The process for macos and Linux is identical. Linux is as follows:
79
79
 
80
80
  ```
81
- curl https://keybase.io/codecovsecurity/pgp_keys.asc | gpg --no-default-keyring --keyring trustedkeys.gpg --import # One-time step
81
+ curl https://keybase.io/codecovsecops/pgp_keys.asc | gpg --no-default-keyring --keyring trustedkeys.gpg --import # One-time step
82
82
  curl -Os https://cli.codecov.io/latest/linux/codecov
83
83
  curl -Os https://cli.codecov.io/latest/linux/codecov.SHA256SUM
84
84
  curl -Os https://cli.codecov.io/latest/linux/codecov.SHA256SUM.sig
@@ -121,7 +121,7 @@ The following tokens are suitable for uploading:
121
121
  If the installation is successful, running `codecovcli --help` will output the available commands along with the different general options that can be used with them.
122
122
 
123
123
  > [!IMPORTANT]
124
- > For up-to-date command usage, please check the `codecovcli_commands` [file](https://github.com/getsentry/prevent-cli/blob/main/codecov-cli/codecovcli_commands)
124
+ > For up-to-date command usage, please check the `codecovcli_commands` [file](https://github.com/codecov/codecov-cli/blob/main/codecovcli_commands)
125
125
 
126
126
  ```
127
127
  Usage: codecovcli [OPTIONS] COMMAND [ARGS]...
@@ -1,7 +1,7 @@
1
1
  # CodecovCLI
2
2
 
3
- [![codecov](https://codecov.io/github/getsentry/prevent-cli/graph/badge.svg?token=K1xQn7DaxT)](https://codecov.io/github/getsentry/prevent-cli)
4
- [![Build-Test-Upload](https://github.com/getsentry/prevent-cli/actions/workflows/ci.yml/badge.svg)](https://github.com/getsentry/prevent-cli/actions/workflows/ci.yml)
3
+ [![codecov](https://codecov.io/github/codecov/codecov-cli/graph/badge.svg?token=K1xQn7DaxT)](https://codecov.io/github/codecov/codecov-cli)
4
+ [![Build-Test-Upload](https://github.com/codecov/codecov-cli/actions/workflows/ci.yml/badge.svg)](https://github.com/codecov/codecov-cli/actions/workflows/ci.yml)
5
5
 
6
6
  CodecovCLI is a new way for users to interact with Codecov directly from the user’s terminal or CI platform. Many Codecov features that require the user’s interference can be done via the codecovCLI. It saves commits, creates reports, uploads coverage and has many more features.
7
7
 
@@ -41,7 +41,7 @@ The above command will download the latest version of Codecov-cli. If you wish t
41
41
  Note: If you're installing in a `pyenv` environment, you may need to call `pyenv rehash` before the CLI will work.
42
42
 
43
43
  ## As a Binary
44
- If you would like to use the CLI in an environment that does not have access to Python / PIP, you can install the CLI as a compiled binary. Linux and macOS releases can be found [here](https://cli.codecov.io/), along with SHASUMs and signatures for each released version. Binary releases are also available via [Github releases](https://github.com/getsentry/prevent-cli/releases) on this repository.
44
+ If you would like to use the CLI in an environment that does not have access to Python / PIP, you can install the CLI as a compiled binary. Linux and macOS releases can be found [here](https://cli.codecov.io/), along with SHASUMs and signatures for each released version. Binary releases are also available via [Github releases](https://github.com/codecov/codecov-cli/releases) on this repository.
45
45
 
46
46
  You can retrieve the Binary for Linux directly from your command line as follows:
47
47
 
@@ -56,7 +56,7 @@ sudo chmod +x codecov
56
56
  The binary can be integrity checked using a SHASUM256 and SHASUM256.sig file. The process for macos and Linux is identical. Linux is as follows:
57
57
 
58
58
  ```
59
- curl https://keybase.io/codecovsecurity/pgp_keys.asc | gpg --no-default-keyring --keyring trustedkeys.gpg --import # One-time step
59
+ curl https://keybase.io/codecovsecops/pgp_keys.asc | gpg --no-default-keyring --keyring trustedkeys.gpg --import # One-time step
60
60
  curl -Os https://cli.codecov.io/latest/linux/codecov
61
61
  curl -Os https://cli.codecov.io/latest/linux/codecov.SHA256SUM
62
62
  curl -Os https://cli.codecov.io/latest/linux/codecov.SHA256SUM.sig
@@ -99,7 +99,7 @@ The following tokens are suitable for uploading:
99
99
  If the installation is successful, running `codecovcli --help` will output the available commands along with the different general options that can be used with them.
100
100
 
101
101
  > [!IMPORTANT]
102
- > For up-to-date command usage, please check the `codecovcli_commands` [file](https://github.com/getsentry/prevent-cli/blob/main/codecov-cli/codecovcli_commands)
102
+ > For up-to-date command usage, please check the `codecovcli_commands` [file](https://github.com/codecov/codecov-cli/blob/main/codecovcli_commands)
103
103
 
104
104
  ```
105
105
  Usage: codecovcli [OPTIONS] COMMAND [ARGS]...
@@ -111,7 +111,10 @@ _global_upload_options = [
111
111
  "--name",
112
112
  help="Custom defined name of the upload. Visible in Codecov UI",
113
113
  cls=CodecovOption,
114
- fallback_field=FallbackFieldEnum.build_code,
114
+ fallback_fields=(
115
+ FallbackFieldEnum.job_name,
116
+ FallbackFieldEnum.build_code,
117
+ ),
115
118
  ),
116
119
  click.option(
117
120
  "-B",
@@ -0,0 +1,78 @@
1
+ import typing
2
+ from enum import Enum, auto
3
+
4
+ import click
5
+
6
+
7
+ class FallbackFieldEnum(Enum):
8
+ branch = auto()
9
+ build_code = auto()
10
+ build_url = auto()
11
+ commit_sha = auto()
12
+ git_service = auto()
13
+ job_code = auto()
14
+ pull_request_number = auto()
15
+ service = auto()
16
+ slug = auto()
17
+ job_name = auto()
18
+
19
+
20
+ _FIELDS_WITH_VERSIONING_FALLBACK = frozenset(
21
+ {
22
+ FallbackFieldEnum.branch,
23
+ FallbackFieldEnum.commit_sha,
24
+ FallbackFieldEnum.slug,
25
+ FallbackFieldEnum.git_service,
26
+ }
27
+ )
28
+
29
+
30
+ class CodecovOption(click.Option):
31
+ fallback_fields: typing.Optional[tuple[FallbackFieldEnum, ...]]
32
+
33
+ def __init__(self, *args, **kwargs):
34
+ fallback_fields = kwargs.pop("fallback_fields", None)
35
+ fallback_field = kwargs.pop("fallback_field", None)
36
+ if fallback_fields is not None:
37
+ self.fallback_fields = tuple(fallback_fields)
38
+ elif fallback_field is not None:
39
+ self.fallback_fields = (fallback_field,)
40
+ else:
41
+ self.fallback_fields = None
42
+ super().__init__(*args, **kwargs)
43
+
44
+ def get_default(
45
+ self, ctx: click.Context, call: bool = True
46
+ ) -> typing.Optional[typing.Union[typing.Any, typing.Callable[[], typing.Any]]]:
47
+ res = super().get_default(ctx, call=call)
48
+ if res is not None:
49
+ return res
50
+ if self.fallback_fields is not None:
51
+ for field in self.fallback_fields:
52
+ if ctx.obj.get("ci_adapter") is not None:
53
+ res = ctx.obj.get("ci_adapter").get_fallback_value(field)
54
+ if res is not None:
55
+ return res
56
+ if (
57
+ ctx.obj.get("versioning_system") is not None
58
+ and field in _FIELDS_WITH_VERSIONING_FALLBACK
59
+ ):
60
+ res = ctx.obj.get("versioning_system").get_fallback_value(field)
61
+ if res is not None:
62
+ return res
63
+ return None
64
+
65
+
66
+ class BrandedOption(click.Option):
67
+ def resolve_envvar_value(self, ctx: click.Context) -> typing.Optional[str]:
68
+ actual_var = self.envvar
69
+ self.envvar = [
70
+ f"{brand.value.upper()}_{actual_var}" for brand in ctx.obj["branding"]
71
+ ]
72
+ res = super().resolve_envvar_value(ctx)
73
+ self.envvar = actual_var
74
+ return res
75
+
76
+
77
+ class BrandedCodecovOption(CodecovOption, BrandedOption):
78
+ pass
@@ -5,6 +5,7 @@ from pathlib import PosixPath
5
5
  import click
6
6
 
7
7
  from codecov_cli import __version__
8
+ from codecov_cli.opentelemetry import set_cli_tags
8
9
 
9
10
  logger = logging.getLogger("codecovcli")
10
11
 
@@ -28,4 +29,6 @@ def get_cli_args(ctx: click.Context):
28
29
  except Exception:
29
30
  continue
30
31
 
32
+ set_cli_tags(filtered_args, ctx)
33
+
31
34
  return filtered_args
@@ -14,6 +14,7 @@ from codecov_cli.helpers.ci_adapters.codebuild import AWSCodeBuildCIAdapter
14
14
  from codecov_cli.helpers.ci_adapters.droneci import DroneCIAdapter
15
15
  from codecov_cli.helpers.ci_adapters.github_actions import GithubActionsCIAdapter
16
16
  from codecov_cli.helpers.ci_adapters.gitlab_ci import GitlabCIAdapter
17
+ from codecov_cli.helpers.ci_adapters.harness import HarnessAdapter
17
18
  from codecov_cli.helpers.ci_adapters.heroku import HerokuCIAdapter
18
19
  from codecov_cli.helpers.ci_adapters.jenkins import JenkinsAdapter
19
20
  from codecov_cli.helpers.ci_adapters.local import LocalAdapter
@@ -48,6 +49,7 @@ def get_ci_providers_list():
48
49
  BitriseCIAdapter(),
49
50
  AppveyorCIAdapter(),
50
51
  WoodpeckerCIAdapter(),
52
+ HarnessAdapter(),
51
53
  HerokuCIAdapter(),
52
54
  DroneCIAdapter(),
53
55
  BuildkiteAdapter(),
@@ -17,6 +17,7 @@ class CIAdapterBase(ABC):
17
17
  FallbackFieldEnum.pull_request_number: self._get_pull_request_number,
18
18
  FallbackFieldEnum.job_code: self._get_job_code,
19
19
  FallbackFieldEnum.git_service: self._get_git_service,
20
+ FallbackFieldEnum.job_name: self._get_job_name,
20
21
  }
21
22
 
22
23
  def get_fallback_value(
@@ -100,3 +101,10 @@ class CIAdapterBase(ABC):
100
101
 
101
102
  def _get_git_service(self):
102
103
  return None
104
+
105
+ def _get_job_name(self):
106
+ """
107
+ Name of the job that gets displayed in the Codecov UI
108
+ Returns: string
109
+ """
110
+ return None
@@ -87,3 +87,10 @@ class GithubActionsCIAdapter(CIAdapterBase):
87
87
 
88
88
  def get_service_name(self):
89
89
  return "GithubActions"
90
+
91
+ def _get_job_name(self):
92
+ github_workflow = os.getenv("GITHUB_WORKFLOW")
93
+ github_job = os.getenv("GITHUB_JOB")
94
+ if github_workflow and github_job:
95
+ return f"{github_workflow} - {github_job}"
96
+ return github_workflow or github_job or None
@@ -0,0 +1,52 @@
1
+ import os
2
+
3
+ from codecov_cli.helpers.ci_adapters.base import CIAdapterBase
4
+ from codecov_cli.helpers.git import parse_slug
5
+
6
+ # https://developer.harness.io/docs/continuous-integration/troubleshoot-ci/ci-env-var/
7
+
8
+ # Uses CI_ prefixed environment variables variant if available and DRONE_ prefixed environment variables variant if not
9
+ # The DRONE variables overlap with the Drone CI Adapter as Harness CI is built on top
10
+ class HarnessAdapter(CIAdapterBase):
11
+ def detect(self) -> bool:
12
+ return bool(os.getenv("HARNESS_BUILD_ID"))
13
+
14
+ def _get_branch(self):
15
+ return os.getenv("DRONE_COMMIT_BRANCH")
16
+
17
+ def _get_commit_sha(self):
18
+ return os.getenv("DRONE_COMMIT_SHA")
19
+
20
+ def _get_pull_request_number(self):
21
+ return os.getenv("DRONE_PULL_REQUEST")
22
+
23
+ def _get_job_code(self):
24
+ return None
25
+
26
+ def _get_build_code(self):
27
+ return os.getenv("CI_BUILD_NUMBER")
28
+
29
+ def _get_build_url(self):
30
+ return os.getenv("CI_BUILD_LINK")
31
+
32
+ def _get_slug(self):
33
+ ci_repo = os.getenv("CI_REPO")
34
+ if ci_repo and "/" in ci_repo:
35
+ return ci_repo
36
+ for env_var in (
37
+ "CI_REPO_REMOTE",
38
+ "CI_REMOTE_URL",
39
+ "CI_REPO_LINK",
40
+ "DRONE_GIT_HTTP_URL",
41
+ "DRONE_REMOTE_URL",
42
+ ):
43
+ if url := os.getenv(env_var):
44
+ if slug := parse_slug(url):
45
+ return slug
46
+ return None
47
+
48
+ def _get_service(self):
49
+ return "harness"
50
+
51
+ def get_service_name(self):
52
+ return "Harness"
@@ -152,7 +152,7 @@ def log_warnings_and_errors_if_any(
152
152
  sending_result: RequestResult, process_desc: str, fail_on_error: bool = False
153
153
  ):
154
154
  logger.info(
155
- f"Process {process_desc} complete",
155
+ f"{process_desc} complete",
156
156
  )
157
157
  logger.debug(
158
158
  f"{process_desc} result",
@@ -0,0 +1,21 @@
1
+ import click
2
+
3
+ from codecov_cli.helpers.git import GitService
4
+
5
+ # The set of acceptable upload services from Shelter
6
+ _CODECOV_UPLOAD_SERVICES = frozenset(s.value for s in GitService) | {"github-actions"}
7
+
8
+
9
+ def validate_upload_service(
10
+ service: str,
11
+ ) -> None:
12
+ allowed = ", ".join(sorted(_CODECOV_UPLOAD_SERVICES))
13
+ if not service:
14
+ raise click.ClickException(
15
+ "Upload service is missing (Codecov requires it for upload URLs). "
16
+ f"Pass --git-service with one of: {allowed}"
17
+ )
18
+ if service not in _CODECOV_UPLOAD_SERVICES:
19
+ raise click.ClickException(
20
+ f"Invalid upload service {service!r}. Use one of: {allowed}"
21
+ )
@@ -0,0 +1,85 @@
1
+ import os
2
+ import random
3
+
4
+ import sentry_sdk
5
+
6
+ from codecov_cli import __version__
7
+
8
+ _SAMPLED_MESSAGES = [
9
+ "Token required",
10
+ "No JUnit XML reports found",
11
+ ]
12
+ _SAMPLE_RATE = 100
13
+ _SKIP_TAG_KEYS = {"branch", "flags", "commit_sha", "env_vars"}
14
+
15
+
16
+ def _before_send(event, hint):
17
+ messages = []
18
+ if "message" in event and event.get("message") is not None:
19
+ messages.append(event.get("message"))
20
+ if "logentry" in event and "message" in event.get("logentry", {}) and event.get("logentry", {}).get("message") is not None:
21
+ messages.append(event.get("logentry", {}).get("message"))
22
+ if "exception" in event and event.get("exception") is not None:
23
+ for exc in event.get("exception", {}).get("values", []):
24
+ if "value" in exc:
25
+ messages.append(exc.get("value"))
26
+
27
+ matched = False
28
+ for message in messages:
29
+ for pattern in _SAMPLED_MESSAGES:
30
+ if pattern in message:
31
+ matched = True
32
+ break
33
+
34
+ if matched and random.randint(1, _SAMPLE_RATE) != 1:
35
+ return None
36
+ return event
37
+
38
+
39
+ def init_telem(ctx):
40
+ if ctx["disable_telem"]:
41
+ return
42
+ if ctx["enterprise_url"]: # dont run on dedicated cloud
43
+ return
44
+ if os.getenv("CODECOV_ENV", "production") == "test":
45
+ return
46
+
47
+ sentry_sdk.init(
48
+ dsn="https://0bea75c61745c221a6ef1ac1709b1f4d@o26192.ingest.us.sentry.io/4508615876083713",
49
+ enable_tracing=True,
50
+ environment=os.getenv("CODECOV_ENV", "production"),
51
+ release=f"cli@{__version__}",
52
+ before_send=_before_send,
53
+ )
54
+
55
+
56
+ def set_cli_tags(args: dict, ctx):
57
+ """Set Sentry tags from resolved CLI arguments."""
58
+ for key, value in args.items():
59
+ if key in _SKIP_TAG_KEYS:
60
+ continue
61
+ if value is None or value in ([], (), {}):
62
+ continue
63
+ if isinstance(value, (list, tuple)):
64
+ value = ",".join(str(v) for v in value)
65
+ elif isinstance(value, dict):
66
+ value = ",".join(
67
+ f"{k}={v}" for k, v in value.items() if v is not None
68
+ )
69
+ sentry_sdk.set_tag(f"cli.{key}", str(value)[:200])
70
+
71
+ token = ctx.params.get("token") if hasattr(ctx, "params") else None
72
+ sentry_sdk.set_tag("cli.token_provided", str(bool(token)).lower())
73
+
74
+ ci_adapter = (
75
+ ctx.obj.get("ci_adapter") if hasattr(ctx, "obj") and ctx.obj else None
76
+ )
77
+ if ci_adapter is not None:
78
+ try:
79
+ sentry_sdk.set_tag("cli.ci_adapter", ci_adapter.get_service_name())
80
+ except Exception:
81
+ pass
82
+
83
+
84
+ def close_telem():
85
+ sentry_sdk.flush()
@@ -2,6 +2,7 @@ import logging
2
2
  import os
3
3
  import typing
4
4
 
5
+ from codecov_cli import __version__ as codecov_cli_version
5
6
  from codecov_cli.helpers.config import CODECOV_INGEST_URL
6
7
  from codecov_cli.helpers.encoder import encode_slug
7
8
  from codecov_cli.helpers.request import (
@@ -9,10 +10,10 @@ from codecov_cli.helpers.request import (
9
10
  log_warnings_and_errors_if_any,
10
11
  send_post_request,
11
12
  )
13
+ from codecov_cli.helpers.upload_url_validation import validate_upload_service
12
14
 
13
15
  logger = logging.getLogger("codecovcli")
14
16
 
15
-
16
17
  def create_commit_logic(
17
18
  commit_sha: str,
18
19
  parent_sha: typing.Optional[str],
@@ -75,10 +76,13 @@ def send_commit_data(
75
76
  "commitid": commit_sha,
76
77
  "parent_commit_id": parent_sha,
77
78
  "pullid": pr,
79
+ "version": codecov_cli_version,
78
80
  }
79
81
 
80
82
  upload_url = enterprise_url or CODECOV_INGEST_URL
81
- url = f"{upload_url}/upload/{service}/{slug}/commits"
83
+ service_part = (service or "").strip()
84
+ validate_upload_service(service_part)
85
+ url = f"{upload_url}/upload/{service_part}/{slug}/commits"
82
86
  return send_post_request(
83
87
  url=url,
84
88
  data=data,
@@ -1,8 +1,11 @@
1
1
  import json
2
2
  import logging
3
3
 
4
+ from codecov_cli import __version__ as codecov_cli_version
4
5
  from codecov_cli.helpers.config import CODECOV_API_URL
5
6
  from codecov_cli.helpers.encoder import encode_slug
7
+ from codecov_cli.helpers.upload_url_validation import validate_upload_service
8
+
6
9
  from codecov_cli.helpers.request import (
7
10
  get_token_header,
8
11
  log_warnings_and_errors_if_any,
@@ -25,13 +28,16 @@ def empty_upload_logic(
25
28
  encoded_slug = encode_slug(slug)
26
29
  headers = get_token_header(token)
27
30
  upload_url = enterprise_url or CODECOV_API_URL
28
- url = f"{upload_url}/upload/{git_service}/{encoded_slug}/commits/{commit_sha}/empty-upload"
31
+ service_part = (git_service or "").strip()
32
+ validate_upload_service(service_part)
33
+ url = f"{upload_url}/upload/{service_part}/{encoded_slug}/commits/{commit_sha}/empty-upload"
29
34
  sending_result = send_post_request(
30
35
  url=url,
31
36
  headers=headers,
32
37
  data={
33
38
  "cli_args": args,
34
39
  "should_force": should_force,
40
+ "version": codecov_cli_version,
35
41
  },
36
42
  )
37
43
  log_warnings_and_errors_if_any(sending_result, "Empty Upload", fail_on_error)
@@ -3,8 +3,7 @@ import logging
3
3
  import time
4
4
  import typing
5
5
 
6
- import requests
7
-
6
+ from codecov_cli import __version__ as codecov_cli_version
8
7
  from codecov_cli.helpers import request
9
8
  from codecov_cli.helpers.config import CODECOV_API_URL, CODECOV_INGEST_URL
10
9
  from codecov_cli.helpers.encoder import encode_slug
@@ -14,6 +13,7 @@ from codecov_cli.helpers.request import (
14
13
  request_result,
15
14
  send_post_request,
16
15
  )
16
+ from codecov_cli.helpers.upload_url_validation import validate_upload_service
17
17
 
18
18
  logger = logging.getLogger("codecovcli")
19
19
  MAX_NUMBER_TRIES = 3
@@ -58,10 +58,13 @@ def send_create_report_request(
58
58
  data = {
59
59
  "cli_args": args,
60
60
  "code": code,
61
+ "version": codecov_cli_version,
61
62
  }
62
63
  headers = get_token_header(token)
63
64
  upload_url = enterprise_url or CODECOV_INGEST_URL
64
- url = f"{upload_url}/upload/{service}/{encoded_slug}/commits/{commit_sha}/reports"
65
+ service_part = (service or "").strip()
66
+ validate_upload_service(service_part)
67
+ url = f"{upload_url}/upload/{service_part}/{encoded_slug}/commits/{commit_sha}/reports"
65
68
  return send_post_request(url=url, headers=headers, data=data)
66
69
 
67
70
 
@@ -103,10 +106,13 @@ def send_reports_result_request(
103
106
  ):
104
107
  data = {
105
108
  "cli_args": args,
109
+ "version": codecov_cli_version,
106
110
  }
107
111
  headers = get_token_header(token)
108
112
  upload_url = enterprise_url or CODECOV_API_URL
109
- url = f"{upload_url}/upload/{service}/{encoded_slug}/commits/{commit_sha}/reports/{report_code}/results"
113
+ service_part = (service or "").strip()
114
+ validate_upload_service(service_part)
115
+ url = f"{upload_url}/upload/{service_part}/{encoded_slug}/commits/{commit_sha}/reports/{report_code}/results"
110
116
  return send_post_request(url=url, data=data, headers=headers)
111
117
 
112
118
 
@@ -121,7 +127,9 @@ def send_reports_result_get_request(
121
127
  ):
122
128
  headers = get_token_header(token)
123
129
  upload_url = enterprise_url or CODECOV_API_URL
124
- url = f"{upload_url}/upload/{service}/{encoded_slug}/commits/{commit_sha}/reports/{report_code}/results"
130
+ service_part = (service or "").strip()
131
+ validate_upload_service(service_part)
132
+ url = f"{upload_url}/upload/{service_part}/{encoded_slug}/commits/{commit_sha}/reports/{report_code}/results"
125
133
  number_tries = 0
126
134
  while number_tries < MAX_NUMBER_TRIES:
127
135
  resp = request.get(url=url, headers=headers)
@@ -165,5 +165,5 @@ def do_upload_logic(
165
165
  status_code=200,
166
166
  text="Data NOT sent to Codecov because of dry-run option",
167
167
  )
168
- log_warnings_and_errors_if_any(sending_result, "Upload", fail_on_error)
168
+ log_warnings_and_errors_if_any(sending_result, "Upload queued for processing", fail_on_error)
169
169
  return sending_result
@@ -2,7 +2,6 @@ import base64
2
2
  import json
3
3
  import logging
4
4
  import typing
5
- import sys
6
5
  import zlib
7
6
  from typing import Any, Dict
8
7
 
@@ -12,6 +11,7 @@ from codecov_cli import __version__ as codecov_cli_version
12
11
  from codecov_cli.helpers.config import CODECOV_INGEST_URL
13
12
  from codecov_cli.helpers.encoder import encode_slug
14
13
  from codecov_cli.helpers.upload_type import ReportType
14
+ from codecov_cli.helpers.upload_url_validation import validate_upload_service
15
15
  from codecov_cli.helpers.request import (
16
16
  get_token_header,
17
17
  send_post_request,
@@ -92,11 +92,14 @@ class UploadSender(object):
92
92
  commit_sha,
93
93
  report_code,
94
94
  upload_coverage,
95
+ file_not_found=file_not_found,
95
96
  )
96
97
  # Data that goes to storage
97
98
  reports_payload = self._generate_payload(
98
99
  upload_data, env_vars, report_type
99
100
  )
101
+ reports_payload_size = len(reports_payload)
102
+ data["report_payload_bytes"] = reports_payload_size
100
103
 
101
104
  with sentry_sdk.start_span(name="upload_sender_storage_request"):
102
105
  logger.debug("Sending upload request to Codecov")
@@ -117,7 +120,7 @@ class UploadSender(object):
117
120
  resp_json_obj = json.loads(resp_from_codecov.text)
118
121
  if resp_json_obj.get("url"):
119
122
  logger.info(
120
- f"Your upload is now processing. When finished, results will be available at: {resp_json_obj.get('url')}"
123
+ f"Your upload is now queued for processing. When finished, results will be available at: {resp_json_obj.get('url')}"
121
124
  )
122
125
  logger.debug(
123
126
  "Upload request to Codecov complete.",
@@ -126,9 +129,8 @@ class UploadSender(object):
126
129
  put_url = resp_json_obj["raw_upload_location"]
127
130
 
128
131
  with sentry_sdk.start_span(name="upload_sender_storage") as storage_span:
129
- payload_size = sys.getsizeof(reports_payload)
130
- storage_span.set_data("payload_size", payload_size)
131
- logger.info(f"Sending upload ({payload_size} bytes) to storage")
132
+ storage_span.set_data("payload_size", reports_payload_size)
133
+ logger.info(f"Sending upload ({reports_payload_size} bytes) to storage")
132
134
  resp_from_storage = send_put_request(put_url, data=reports_payload)
133
135
 
134
136
  return resp_from_storage
@@ -218,8 +220,11 @@ class UploadSender(object):
218
220
  upload_coverage=False,
219
221
  file_not_found=False,
220
222
  ):
223
+ service_part = (git_service or "").strip()
224
+
221
225
  if report_type == ReportType.COVERAGE:
222
- base_url = f"{upload_url}/upload/{git_service}/{encoded_slug}"
226
+ validate_upload_service(service_part)
227
+ base_url = f"{upload_url}/upload/{service_part}/{encoded_slug}"
223
228
  if upload_coverage:
224
229
  url = f"{base_url}/upload-coverage"
225
230
  else:
@@ -228,7 +233,7 @@ class UploadSender(object):
228
233
  data["slug"] = encoded_slug
229
234
  data["branch"] = branch
230
235
  data["commit"] = commit_sha
231
- data["service"] = git_service
236
+ data["service"] = service_part if service_part else None
232
237
  data["file_not_found"] = file_not_found
233
238
  url = f"{upload_url}/upload/test_results/v1"
234
239
 
@@ -1,8 +1,10 @@
1
1
  import json
2
2
  import logging
3
3
 
4
+ from codecov_cli import __version__ as codecov_cli_version
4
5
  from codecov_cli.helpers.config import CODECOV_API_URL
5
6
  from codecov_cli.helpers.encoder import encode_slug
7
+ from codecov_cli.helpers.upload_url_validation import validate_upload_service
6
8
  from codecov_cli.helpers.request import (
7
9
  get_token_header,
8
10
  log_warnings_and_errors_if_any,
@@ -24,9 +26,12 @@ def upload_completion_logic(
24
26
  encoded_slug = encode_slug(slug)
25
27
  headers = get_token_header(token)
26
28
  upload_url = enterprise_url or CODECOV_API_URL
27
- url = f"{upload_url}/upload/{git_service}/{encoded_slug}/commits/{commit_sha}/upload-complete"
29
+ service_part = (git_service or "").strip()
30
+ validate_upload_service(service_part)
31
+ url = f"{upload_url}/upload/{service_part}/{encoded_slug}/commits/{commit_sha}/upload-complete"
28
32
  data = {
29
33
  "cli_args": args,
34
+ "version": codecov_cli_version,
30
35
  }
31
36
  sending_result = send_post_request(url=url, data=data, headers=headers)
32
37
  log_warnings_and_errors_if_any(