sentry-cli 3.4.2__tar.gz → 3.4.3__tar.gz

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

Potentially problematic release.


This version of sentry-cli might be problematic. Click here for more details.

Files changed (181) hide show
  1. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/Cargo.lock +6 -5
  2. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/Cargo.toml +3 -2
  3. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/PKG-INFO +1 -1
  4. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/sentry_cli.egg-info/PKG-INFO +1 -1
  5. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/sentry_cli.egg-info/SOURCES.txt +1 -0
  6. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/mod.rs +7 -5
  7. sentry_cli-3.4.3/src/api/updating.rs +80 -0
  8. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/bashsupport.sh +3 -3
  9. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/bash_hook.rs +44 -26
  10. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/build/snapshots.rs +67 -23
  11. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/react_native/xcode.rs +7 -2
  12. sentry_cli-3.4.3/src/commands/releases/propose_version.rs +19 -0
  13. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/send_event.rs +9 -2
  14. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/config.rs +50 -10
  15. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/args.rs +10 -0
  16. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/releases.rs +10 -6
  17. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/update.rs +29 -4
  18. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/xcode.rs +21 -8
  19. sentry_cli-3.4.2/src/commands/releases/propose_version.rs +0 -13
  20. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/LICENSE +0 -0
  21. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/MANIFEST.in +0 -0
  22. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/README.md +0 -0
  23. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/apple-catalog-parsing/AGENTS.md +0 -0
  24. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/apple-catalog-parsing/CLAUDE.md +0 -0
  25. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/apple-catalog-parsing/Cargo.toml +0 -0
  26. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/apple-catalog-parsing/build.rs +0 -0
  27. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/apple-catalog-parsing/native/swift/AssetCatalogParser/Package.swift +0 -0
  28. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/apple-catalog-parsing/native/swift/AssetCatalogParser/Sources/AssetCatalogParser/AssetCatalogReader.swift +0 -0
  29. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/apple-catalog-parsing/native/swift/AssetCatalogParser/Sources/ObjcSupport/include/safeValueForKey.h +0 -0
  30. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/apple-catalog-parsing/native/swift/AssetCatalogParser/Sources/ObjcSupport/safeValueForKey.m +0 -0
  31. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/apple-catalog-parsing/native/swift/AssetCatalogParser/Tests/AssetCatalogParserTests/AssetCatalogParserTests.swift +0 -0
  32. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/apple-catalog-parsing/native/swift/AssetCatalogParser/Tests/AssetCatalogParserTests/Resources/test.xcarchive/Info.plist +0 -0
  33. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/apple-catalog-parsing/native/swift/AssetCatalogParser/Tests/AssetCatalogParserTests/Resources/test.xcarchive/Products/Applications/DemoApp.app/Assets.car +0 -0
  34. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/apple-catalog-parsing/src/asset_catalog.rs +0 -0
  35. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/apple-catalog-parsing/src/lib.rs +0 -0
  36. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/build.rs +0 -0
  37. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/pyproject.toml +0 -0
  38. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/sentry_cli.egg-info/dependency_links.txt +0 -0
  39. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/sentry_cli.egg-info/top_level.txt +0 -0
  40. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/setup.cfg +0 -0
  41. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/setup.py +0 -0
  42. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/AGENTS.md +0 -0
  43. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/CLAUDE.md +0 -0
  44. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/connection_manager.rs +0 -0
  45. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/data_types/chunking/artifact.rs +0 -0
  46. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/data_types/chunking/build.rs +0 -0
  47. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/data_types/chunking/compression.rs +0 -0
  48. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/data_types/chunking/dif.rs +0 -0
  49. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/data_types/chunking/file_state.rs +0 -0
  50. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/data_types/chunking/hash_algorithm.rs +0 -0
  51. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/data_types/chunking/mod.rs +0 -0
  52. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/data_types/chunking/upload/mod.rs +0 -0
  53. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/data_types/chunking/upload/options.rs +0 -0
  54. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/data_types/code_mappings.rs +0 -0
  55. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/data_types/deploy.rs +0 -0
  56. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/data_types/mod.rs +0 -0
  57. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/data_types/snapshots.rs +0 -0
  58. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/encoding.rs +0 -0
  59. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/envelopes_api.rs +0 -0
  60. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/errors/api_error.rs +0 -0
  61. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/errors/mod.rs +0 -0
  62. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/errors/sentry_error.rs +0 -0
  63. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/pagination.rs +0 -0
  64. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/serialization.rs +0 -0
  65. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/build/download.rs +0 -0
  66. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/build/mod.rs +0 -0
  67. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/build/upload.rs +0 -0
  68. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/code_mappings/mod.rs +0 -0
  69. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/code_mappings/upload.rs +0 -0
  70. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/dart_symbol_map/mod.rs +0 -0
  71. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/dart_symbol_map/upload.rs +0 -0
  72. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/debug_files/bundle_jvm.rs +0 -0
  73. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/debug_files/bundle_sources.rs +0 -0
  74. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/debug_files/check.rs +0 -0
  75. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/debug_files/find.rs +0 -0
  76. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/debug_files/mod.rs +0 -0
  77. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/debug_files/print_sources.rs +0 -0
  78. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/debug_files/upload.rs +0 -0
  79. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/deploys/list.rs +0 -0
  80. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/deploys/mod.rs +0 -0
  81. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/deploys/new.rs +0 -0
  82. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/derive_parser.rs +0 -0
  83. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/events/list.rs +0 -0
  84. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/events/mod.rs +0 -0
  85. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/info.rs +0 -0
  86. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/issues/list.rs +0 -0
  87. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/issues/mod.rs +0 -0
  88. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/issues/mute.rs +0 -0
  89. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/issues/resolve.rs +0 -0
  90. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/issues/unresolve.rs +0 -0
  91. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/login.rs +0 -0
  92. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/logs/list.rs +0 -0
  93. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/logs/mod.rs +0 -0
  94. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/mod.rs +0 -0
  95. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/monitors/list.rs +0 -0
  96. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/monitors/mod.rs +0 -0
  97. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/monitors/run.rs +0 -0
  98. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/organizations/list.rs +0 -0
  99. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/organizations/mod.rs +0 -0
  100. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/proguard/mod.rs +0 -0
  101. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/proguard/upload.rs +0 -0
  102. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/proguard/uuid.rs +0 -0
  103. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/projects/list.rs +0 -0
  104. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/projects/mod.rs +0 -0
  105. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/react_native/gradle.rs +0 -0
  106. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/react_native/mod.rs +0 -0
  107. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/releases/archive.rs +0 -0
  108. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/releases/delete.rs +0 -0
  109. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/releases/finalize.rs +0 -0
  110. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/releases/info.rs +0 -0
  111. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/releases/list.rs +0 -0
  112. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/releases/mod.rs +0 -0
  113. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/releases/new.rs +0 -0
  114. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/releases/restore.rs +0 -0
  115. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/releases/set_commits.rs +0 -0
  116. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/repos/list.rs +0 -0
  117. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/repos/mod.rs +0 -0
  118. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/send_envelope.rs +0 -0
  119. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/send_metric/common_args.rs +0 -0
  120. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/send_metric/increment.rs +0 -0
  121. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/send_metric/mod.rs +0 -0
  122. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/send_metric/set.rs +0 -0
  123. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/sourcemaps/inject.rs +0 -0
  124. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/sourcemaps/mod.rs +0 -0
  125. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/sourcemaps/resolve.rs +0 -0
  126. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/sourcemaps/upload.rs +0 -0
  127. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/uninstall.rs +0 -0
  128. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/update.rs +0 -0
  129. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/upload_dif.rs +0 -0
  130. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/upload_dsym.rs +0 -0
  131. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/upload_proguard.rs +0 -0
  132. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/constants.rs +0 -0
  133. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/main.rs +0 -0
  134. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/android.rs +0 -0
  135. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/auth_token/auth_token_impl.rs +0 -0
  136. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/auth_token/error.rs +0 -0
  137. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/auth_token/mod.rs +0 -0
  138. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/auth_token/org_auth_token.rs +0 -0
  139. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/auth_token/redacting.rs +0 -0
  140. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/auth_token/test.rs +0 -0
  141. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/auth_token/user_auth_token.rs +0 -0
  142. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/build/apple.rs +0 -0
  143. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/build/mod.rs +0 -0
  144. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/build/normalize.rs +0 -0
  145. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/build/validation.rs +0 -0
  146. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/build_vcs.rs +0 -0
  147. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/chunks/mod.rs +0 -0
  148. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/chunks/options.rs +0 -0
  149. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/chunks/types.rs +0 -0
  150. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/chunks/upload.rs +0 -0
  151. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/ci.rs +0 -0
  152. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/cordova.rs +0 -0
  153. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/dif.rs +0 -0
  154. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/dif_upload/error.rs +0 -0
  155. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/dif_upload/mod.rs +0 -0
  156. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/event.rs +0 -0
  157. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/file_search.rs +0 -0
  158. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/file_upload.rs +0 -0
  159. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/formatting.rs +0 -0
  160. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/fs.rs +0 -0
  161. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/http.rs +0 -0
  162. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/logging.rs +0 -0
  163. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/mod.rs +0 -0
  164. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/non_empty.rs +0 -0
  165. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/progress.rs +0 -0
  166. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/proguard/mapping.rs +0 -0
  167. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/proguard/mod.rs +0 -0
  168. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/proguard/upload.rs +0 -0
  169. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/retry.rs +0 -0
  170. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/snapshots/sentry_cli__utils__vcs__tests__generate_patch_default_twenty.snap +0 -0
  171. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/snapshots/sentry_cli__utils__vcs__tests__generate_patch_ignore_missing.snap +0 -0
  172. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/snapshots/sentry_cli__utils__vcs__tests__generate_patch_set_base.snap +0 -0
  173. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/snapshots/sentry_cli__utils__vcs__tests__generate_patch_set_previous_commit.snap +0 -0
  174. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/snapshots/sentry_cli__utils__vcs__tests__get_commits_from_git.snap +0 -0
  175. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/source_bundle.rs +0 -0
  176. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/sourcemaps/inject.rs +0 -0
  177. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/sourcemaps.rs +0 -0
  178. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/system.rs +0 -0
  179. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/ui.rs +0 -0
  180. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/value_parsers.rs +0 -0
  181. {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/vcs.rs +0 -0
@@ -2300,9 +2300,9 @@ dependencies = [
2300
2300
 
2301
2301
  [[package]]
2302
2302
  name = "objectstore-client"
2303
- version = "0.1.6"
2303
+ version = "0.1.9"
2304
2304
  source = "registry+https://github.com/rust-lang/crates.io-index"
2305
- checksum = "f99caa869461b61decd1985c029d7e1462d1bde8e2448040db27d567165fcc1e"
2305
+ checksum = "754d0120cf9036efad549de3d65223998b5b7ab00943686dd96acdb926a0cfe6"
2306
2306
  dependencies = [
2307
2307
  "async-compression",
2308
2308
  "bytes",
@@ -2323,9 +2323,9 @@ dependencies = [
2323
2323
 
2324
2324
  [[package]]
2325
2325
  name = "objectstore-types"
2326
- version = "0.1.6"
2326
+ version = "0.1.9"
2327
2327
  source = "registry+https://github.com/rust-lang/crates.io-index"
2328
- checksum = "c375bccef8773d1739eabb7e2b1bbd7e9a9071c8f9557e3b50dce7220e8c8736"
2328
+ checksum = "75d2e3c60712032c880ec7fc56cd01856eb438968957b4c136acd4e6d66f3580"
2329
2329
  dependencies = [
2330
2330
  "http",
2331
2331
  "humantime",
@@ -3391,7 +3391,7 @@ dependencies = [
3391
3391
 
3392
3392
  [[package]]
3393
3393
  name = "sentry-cli"
3394
- version = "3.4.2"
3394
+ version = "3.4.3"
3395
3395
  dependencies = [
3396
3396
  "anyhow",
3397
3397
  "anylog",
@@ -3410,6 +3410,7 @@ dependencies = [
3410
3410
  "dotenvy",
3411
3411
  "elementtree",
3412
3412
  "flate2",
3413
+ "futures-util",
3413
3414
  "git2",
3414
3415
  "glob",
3415
3416
  "http",
@@ -1,7 +1,7 @@
1
1
  [package]
2
2
  build = "build.rs"
3
3
  name = "sentry-cli"
4
- version = "3.4.2"
4
+ version = "3.4.3"
5
5
  edition = "2021"
6
6
  rust-version = "1.91"
7
7
 
@@ -31,6 +31,7 @@ elementtree = "1.2.3"
31
31
  flate2 = { version = "1.0.25", default-features = false, features = [
32
32
  "rust_backend",
33
33
  ] }
34
+ futures-util = "0.3"
34
35
  git2 = { version = "0.20.4", default-features = false }
35
36
  glob = "0.3.1"
36
37
  http = "1.4.0"
@@ -44,7 +45,7 @@ java-properties = "2.0.0"
44
45
  lazy_static = "1.4.0"
45
46
  libc = "0.2.139"
46
47
  log = { version = "0.4.17", features = ["std"] }
47
- objectstore-client = { version = "0.1.6" , default-features = false, features = ["native-tls"] }
48
+ objectstore-client = { version = "0.1.9" , default-features = false, features = ["native-tls"] }
48
49
  open = "3.2.0"
49
50
  parking_lot = "0.12.1"
50
51
  percent-encoding = "2.2.0"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sentry_cli
3
- Version: 3.4.2
3
+ Version: 3.4.3
4
4
  Summary: A command line utility to work with Sentry.
5
5
  Home-page: https://github.com/getsentry/sentry-cli
6
6
  Author: Sentry
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sentry_cli
3
- Version: 3.4.2
3
+ Version: 3.4.3
4
4
  Summary: A command line utility to work with Sentry.
5
5
  Home-page: https://github.com/getsentry/sentry-cli
6
6
  Author: Sentry
@@ -36,6 +36,7 @@ src/api/envelopes_api.rs
36
36
  src/api/mod.rs
37
37
  src/api/pagination.rs
38
38
  src/api/serialization.rs
39
+ src/api/updating.rs
39
40
  src/api/data_types/code_mappings.rs
40
41
  src/api/data_types/deploy.rs
41
42
  src/api/data_types/mod.rs
@@ -11,6 +11,7 @@ mod encoding;
11
11
  mod errors;
12
12
  mod pagination;
13
13
  mod serialization;
14
+ mod updating;
14
15
 
15
16
  use std::borrow::Cow;
16
17
  use std::cell::RefCell;
@@ -57,6 +58,7 @@ use encoding::{PathArg, QueryArg};
57
58
  use errors::{ApiError, ApiErrorKind, ApiResult, SentryError};
58
59
 
59
60
  pub use self::data_types::*;
61
+ pub use crate::api::updating::ReleaseRegistryFile;
60
62
 
61
63
  lazy_static! {
62
64
  static ref API: Mutex<Option<Arc<Api>>> = Mutex::new(None);
@@ -335,13 +337,13 @@ impl Api {
335
337
 
336
338
  if resp.status() == 200 {
337
339
  let info: RegistryRelease = resp.convert()?;
338
- for (filename, _download_url) in info.file_urls {
340
+ for (filename, _download_url) in info.files {
339
341
  info!("Found asset {filename}");
340
342
  if filename == ref_name {
341
343
  return Ok(Some(SentryCliRelease {
342
344
  version: info.version,
343
345
  #[cfg(not(feature = "managed"))]
344
- download_url: _download_url,
346
+ download_info: _download_url,
345
347
  }));
346
348
  }
347
349
  }
@@ -1729,17 +1731,17 @@ pub struct ReleaseCommit {
1729
1731
  pub id: String,
1730
1732
  }
1731
1733
 
1732
- #[derive(Debug, Serialize, Deserialize)]
1734
+ #[derive(Debug, Deserialize)]
1733
1735
  struct RegistryRelease {
1734
1736
  version: String,
1735
- file_urls: HashMap<String, String>,
1737
+ files: HashMap<String, ReleaseRegistryFile>,
1736
1738
  }
1737
1739
 
1738
1740
  /// Information about sentry CLI releases
1739
1741
  pub struct SentryCliRelease {
1740
1742
  pub version: String,
1741
1743
  #[cfg(not(feature = "managed"))]
1742
- pub download_url: String,
1744
+ pub download_info: ReleaseRegistryFile,
1743
1745
  }
1744
1746
 
1745
1747
  #[derive(Debug, Deserialize, Default)]
@@ -0,0 +1,80 @@
1
+ //! Types for updating functionality.
2
+
3
+ use std::ops::Deref;
4
+ use std::str::FromStr;
5
+
6
+ use anyhow::{Context as _, Error};
7
+ use serde::de::Error as _;
8
+ use serde::{Deserialize, Deserializer};
9
+
10
+ /// A SHA-256 sum in hexadecimal representation is 64 characters long.
11
+ const SHA256_SUM_HEX_LENGTH: usize = 64;
12
+
13
+ #[derive(Debug)]
14
+ pub struct Sha256Sum([u8; 32]);
15
+
16
+ #[derive(Debug, Deserialize)]
17
+ pub struct ReleaseRegistryFile {
18
+ pub url: String,
19
+ #[serde(rename = "checksums")]
20
+ #[serde(deserialize_with = "deserialize_checksums")]
21
+ pub checksum: Sha256Sum,
22
+ }
23
+
24
+ fn deserialize_checksums<'de, D>(deserializer: D) -> Result<Sha256Sum, D::Error>
25
+ where
26
+ D: Deserializer<'de>,
27
+ {
28
+ #[derive(Deserialize)]
29
+ #[serde(rename_all = "kebab-case")]
30
+ struct RawChecksumsMapping {
31
+ sha256_hex: String,
32
+ }
33
+
34
+ let RawChecksumsMapping { sha256_hex } = RawChecksumsMapping::deserialize(deserializer)?;
35
+ sha256_hex.parse().map_err(D::Error::custom)
36
+ }
37
+
38
+ impl FromStr for Sha256Sum {
39
+ type Err = Error;
40
+
41
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
42
+ if s.len() != SHA256_SUM_HEX_LENGTH {
43
+ anyhow::bail!(
44
+ "cannot parse SHA-256: expected a {SHA256_SUM_HEX_LENGTH}-character long string"
45
+ );
46
+ }
47
+
48
+ let mut bytes = [0u8; 32];
49
+
50
+ bytes
51
+ .iter_mut()
52
+ .zip(s.as_bytes().chunks(2))
53
+ .map(|(byte, hex_byte)| {
54
+ let hex_str = str::from_utf8(hex_byte)?;
55
+ *byte = u8::from_str_radix(hex_str, 16)?;
56
+ Ok::<_, Self::Err>(())
57
+ })
58
+ .map(|result| result.context("cannot parse SHA-256: not a valid hex string"))
59
+ .collect::<Result<Vec<()>, _>>()?;
60
+
61
+ Ok(Sha256Sum(bytes))
62
+ }
63
+ }
64
+
65
+ impl Deref for Sha256Sum {
66
+ type Target = [u8; 32];
67
+
68
+ fn deref(&self) -> &Self::Target {
69
+ &self.0
70
+ }
71
+ }
72
+
73
+ impl<Rhs> PartialEq<Rhs> for Sha256Sum
74
+ where
75
+ Rhs: Deref<Target = [u8]>,
76
+ {
77
+ fn eq(&self, other: &Rhs) -> bool {
78
+ self.0 == **other
79
+ }
80
+ }
@@ -1,5 +1,5 @@
1
- _SENTRY_TRACEBACK_FILE="___SENTRY_TRACEBACK_FILE___"
2
- _SENTRY_LOG_FILE="___SENTRY_LOG_FILE___"
1
+ _SENTRY_TRACEBACK_FILE=___SENTRY_TRACEBACK_FILE___
2
+ _SENTRY_LOG_FILE=___SENTRY_LOG_FILE___
3
3
 
4
4
  if [ "${SENTRY_CLI_NO_EXIT_TRAP-0}" != 1 ]; then
5
5
  trap _sentry_exit_trap EXIT
@@ -32,7 +32,7 @@ _sentry_err_trap() {
32
32
  echo "@exit_code:${_exit_code}" >> "$_SENTRY_TRACEBACK_FILE"
33
33
 
34
34
  : >> "$_SENTRY_LOG_FILE"
35
- export SENTRY_LAST_EVENT=$(___SENTRY_CLI___ bash-hook --send-event --traceback "$_SENTRY_TRACEBACK_FILE" ___SENTRY_TAGS___ ___SENTRY_RELEASE___ --log "$_SENTRY_LOG_FILE" ___SENTRY_NO_ENVIRON___)
35
+ export SENTRY_LAST_EVENT=$(___SENTRY_CLI___ bash-hook --send-event --traceback "$_SENTRY_TRACEBACK_FILE" ___SENTRY_TAGS___ ___SENTRY_RELEASE___ ___SENTRY_ALLOW_XCODE_INFOPLIST_PREPROCESSING___ --log "$_SENTRY_LOG_FILE")
36
36
  rm -f "$_SENTRY_TRACEBACK_FILE" "$_SENTRY_LOG_FILE"
37
37
  }
38
38
 
@@ -11,11 +11,12 @@ use anyhow::{format_err, Result};
11
11
  use clap::{builder::ArgPredicate, Arg, ArgAction, ArgMatches, Command};
12
12
  use lazy_static::lazy_static;
13
13
  use regex::Regex;
14
- use sentry::protocol::{Event, Exception, Frame, Stacktrace, User, Value};
14
+ use sentry::protocol::{Event, Exception, Frame, Stacktrace, User};
15
15
  use uuid::Uuid;
16
16
 
17
17
  use crate::commands::send_event;
18
18
  use crate::config::Config;
19
+ use crate::utils::args::allow_xcode_infoplist_preprocessing_arg;
19
20
  use crate::utils::event::{attach_logfile, get_sdk_info};
20
21
  use crate::utils::releases::detect_release_name;
21
22
 
@@ -40,8 +41,9 @@ pub fn make_command(command: Command) -> Command {
40
41
  .arg(
41
42
  Arg::new("no_environ")
42
43
  .long("no-environ")
44
+ .hide(true)
43
45
  .action(ArgAction::SetTrue)
44
- .help("Do not send environment variables along"),
46
+ .help("No-op, as we never send envrionment variables."),
45
47
  )
46
48
  .arg(
47
49
  Arg::new("cli")
@@ -49,6 +51,7 @@ pub fn make_command(command: Command) -> Command {
49
51
  .value_name("CMD")
50
52
  .help("Explicitly set/override the sentry-cli command"),
51
53
  )
54
+ .arg(allow_xcode_infoplist_preprocessing_arg())
52
55
  .arg(
53
56
  Arg::new("send_event")
54
57
  .long("send-event")
@@ -87,13 +90,15 @@ fn send_event(
87
90
  logfile: &str,
88
91
  tags: &[&String],
89
92
  release: Option<String>,
90
- environ: bool,
93
+ allow_xcode_infoplist_preprocessing: bool,
91
94
  ) -> Result<()> {
92
95
  let config = Config::current();
93
96
 
94
97
  let mut event = Event {
95
98
  environment: config.get_environment().map(Into::into),
96
- release: release.or(detect_release_name().ok()).map(Into::into),
99
+ release: release
100
+ .or(detect_release_name(allow_xcode_infoplist_preprocessing).ok())
101
+ .map(Into::into),
97
102
  sdk: Some(get_sdk_info()),
98
103
  user: whoami::fallible::username().ok().map(|n| User {
99
104
  username: Some(n),
@@ -112,13 +117,6 @@ fn send_event(
112
117
  event.tags.insert(key.into(), value.into());
113
118
  }
114
119
 
115
- if environ {
116
- event.extra.insert(
117
- "environ".into(),
118
- Value::Object(env::vars().map(|(k, v)| (k, Value::String(v))).collect()),
119
- );
120
- }
121
-
122
120
  let mut cmd = "unknown".to_owned();
123
121
  let mut exit_code = 1;
124
122
  let mut frames = vec![];
@@ -208,6 +206,10 @@ fn send_event(
208
206
  Ok(())
209
207
  }
210
208
 
209
+ fn shell_quote(value: &str) -> String {
210
+ format!("'{}'", value.replace('\'', r"'\''"))
211
+ }
212
+
211
213
  pub fn execute(matches: &ArgMatches) -> Result<()> {
212
214
  let release = Config::current().get_release(matches).ok();
213
215
 
@@ -222,7 +224,7 @@ pub fn execute(matches: &ArgMatches) -> Result<()> {
222
224
  matches.get_one::<String>("log").unwrap(),
223
225
  &tags,
224
226
  release,
225
- !matches.get_flag("no_environ"),
227
+ matches.get_flag("allow_xcode_infoplist_preprocessing"),
226
228
  );
227
229
  }
228
230
 
@@ -235,15 +237,18 @@ pub fn execute(matches: &ArgMatches) -> Result<()> {
235
237
  let mut script = BASH_SCRIPT
236
238
  .replace(
237
239
  "___SENTRY_TRACEBACK_FILE___",
238
- &traceback.display().to_string(),
240
+ &shell_quote(&traceback.display().to_string()),
239
241
  )
240
- .replace("___SENTRY_LOG_FILE___", &log.display().to_string());
242
+ .replace(
243
+ "___SENTRY_LOG_FILE___",
244
+ &shell_quote(&log.display().to_string()),
245
+ );
241
246
 
242
247
  script = script.replace(
243
248
  " ___SENTRY_TAGS___",
244
249
  &tags
245
250
  .iter()
246
- .map(|tag| format!(" --tag \"{tag}\""))
251
+ .map(|tag| format!(" --tag {}", shell_quote(tag)))
247
252
  .collect::<Vec<_>>()
248
253
  .join(""),
249
254
  );
@@ -251,26 +256,26 @@ pub fn execute(matches: &ArgMatches) -> Result<()> {
251
256
  script = match release {
252
257
  Some(release) => script.replace(
253
258
  " ___SENTRY_RELEASE___",
254
- format!(" --release \"{release}\"").as_str(),
259
+ format!(" --release {}", shell_quote(&release)).as_str(),
255
260
  ),
256
261
  None => script.replace(" ___SENTRY_RELEASE___", ""),
257
262
  };
258
263
 
259
264
  script = script.replace(
260
265
  "___SENTRY_CLI___",
261
- matches
262
- .get_one::<String>("cli")
263
- .map_or_else(
264
- || env::current_exe().unwrap().display().to_string(),
265
- String::clone,
266
- )
267
- .as_str(),
266
+ &shell_quote(&matches.get_one::<String>("cli").map_or_else(
267
+ || env::current_exe().unwrap().display().to_string(),
268
+ String::clone,
269
+ )),
268
270
  );
269
271
 
270
- if matches.get_flag("no_environ") {
271
- script = script.replace("___SENTRY_NO_ENVIRON___", "--no-environ");
272
+ if matches.get_flag("allow_xcode_infoplist_preprocessing") {
273
+ script = script.replace(
274
+ " ___SENTRY_ALLOW_XCODE_INFOPLIST_PREPROCESSING___",
275
+ " --allow-xcode-infoplist-preprocessing",
276
+ );
272
277
  } else {
273
- script = script.replace("___SENTRY_NO_ENVIRON___", "");
278
+ script = script.replace(" ___SENTRY_ALLOW_XCODE_INFOPLIST_PREPROCESSING___", "");
274
279
  }
275
280
 
276
281
  if !matches.get_flag("no_exit") {
@@ -279,3 +284,16 @@ pub fn execute(matches: &ArgMatches) -> Result<()> {
279
284
  println!("{script}");
280
285
  Ok(())
281
286
  }
287
+
288
+ #[cfg(test)]
289
+ mod tests {
290
+ use super::shell_quote;
291
+
292
+ #[test]
293
+ fn shell_quote_handles_special_characters() {
294
+ assert_eq!(
295
+ shell_quote("it's $(unsafe); && ok"),
296
+ "'it'\\''s $(unsafe); && ok'"
297
+ );
298
+ }
299
+ }
@@ -1,4 +1,4 @@
1
- use std::collections::HashMap;
1
+ use std::collections::{HashMap, HashSet};
2
2
  use std::fs::File;
3
3
  use std::io::BufReader;
4
4
  use std::path::{Path, PathBuf};
@@ -8,9 +8,10 @@ use std::time::Duration;
8
8
  use anyhow::{Context as _, Result};
9
9
  use clap::{Arg, ArgMatches, Command};
10
10
  use console::style;
11
+ use futures_util::StreamExt as _;
11
12
  use itertools::Itertools as _;
12
13
  use log::{debug, warn};
13
- use objectstore_client::{ClientBuilder, ExpirationPolicy, Usecase};
14
+ use objectstore_client::{ClientBuilder, ExpirationPolicy, OperationResult, Usecase};
14
15
  use rayon::prelude::*;
15
16
  use secrecy::ExposeSecret as _;
16
17
  use serde_json::Value;
@@ -118,6 +119,14 @@ pub fn execute(matches: &ArgMatches) -> Result<()> {
118
119
  // Always collect git metadata, but only perform automatic inference when enabled
119
120
  let vcs_info = collect_git_metadata(matches, &config, should_collect_git_metadata);
120
121
 
122
+ if vcs_info.pr_number.is_some() && vcs_info.base_sha.is_none() {
123
+ anyhow::bail!(
124
+ "A PR number was provided but no base SHA could be determined. \
125
+ Snapshot comparisons require a base SHA to identify the base build. \
126
+ Pass --base-sha explicitly or ensure your CI environment exposes the merge base."
127
+ );
128
+ }
129
+
121
130
  debug!("Scanning for images in: {}", dir_path.display());
122
131
  debug!("Organization: {org}");
123
132
  debug!("Project: {project}");
@@ -138,9 +147,8 @@ pub fn execute(matches: &ArgMatches) -> Result<()> {
138
147
 
139
148
  validate_image_sizes(&images)?;
140
149
 
141
- // Upload image files to objectstore
142
150
  println!(
143
- "{} Uploading {} image {}",
151
+ "{} Processing {} image {}",
144
152
  style(">").dim(),
145
153
  style(images.len()).yellow(),
146
154
  if images.len() == 1 { "file" } else { "files" }
@@ -408,33 +416,69 @@ fn upload_images(
408
416
 
409
417
  let total_count = uploads.len();
410
418
 
411
- let mut many_builder = session.many();
412
- for prepared in uploads {
413
- many_builder = many_builder.push(
414
- session
415
- .put_path(prepared.path.clone())
416
- .key(&prepared.key)
417
- .expiration_policy(expiration),
419
+ let existing_keys: HashSet<String> = runtime.block_on(async {
420
+ let mut head_builder = session.many();
421
+ for prepared in &uploads {
422
+ head_builder = head_builder.push(session.head(&prepared.key));
423
+ }
424
+
425
+ let mut results = head_builder.send().await;
426
+ let mut existing = HashSet::new();
427
+ while let Some(result) = results.next().await {
428
+ if let OperationResult::Head(key, Ok(Some(_))) = result {
429
+ existing.insert(key);
430
+ }
431
+ }
432
+ existing
433
+ });
434
+
435
+ let missing_uploads: Vec<_> = uploads
436
+ .into_iter()
437
+ .filter(|p| !existing_keys.contains(&p.key))
438
+ .collect();
439
+ let skipped = total_count - missing_uploads.len();
440
+ let upload_count = missing_uploads.len();
441
+
442
+ if skipped > 0 {
443
+ println!(
444
+ "{} {} of {total_count} {} already uploaded, uploading {} new",
445
+ style(">").dim(),
446
+ style(skipped).yellow(),
447
+ if total_count == 1 { "image" } else { "images" },
448
+ style(upload_count).yellow(),
418
449
  );
419
450
  }
420
451
 
421
- let result = runtime.block_on(async { many_builder.send().await.error_for_failures().await });
422
- if let Err(errors) = result {
423
- let errors: Vec<_> = errors.collect();
424
- let error_count = errors.len();
425
- eprintln!("There were errors uploading images:");
426
- for error in errors {
427
- let error = anyhow::Error::new(error);
428
- eprintln!(" {}", style(format!("{error:#}")).red());
452
+ if upload_count > 0 {
453
+ let mut many_builder = session.many();
454
+ for prepared in missing_uploads {
455
+ many_builder = many_builder.push(
456
+ session
457
+ .put_path(prepared.path.clone())
458
+ .key(&prepared.key)
459
+ .expiration_policy(expiration),
460
+ );
461
+ }
462
+
463
+ let result =
464
+ runtime.block_on(async { many_builder.send().await.error_for_failures().await });
465
+ if let Err(errors) = result {
466
+ let errors: Vec<_> = errors.collect();
467
+ let error_count = errors.len();
468
+ eprintln!("There were errors uploading images:");
469
+ for error in errors {
470
+ let error = anyhow::Error::new(error);
471
+ eprintln!(" {}", style(format!("{error:#}")).red());
472
+ }
473
+ anyhow::bail!("Failed to upload {error_count} images");
429
474
  }
430
- anyhow::bail!("Failed to upload {error_count} images");
431
475
  }
432
476
 
433
477
  println!(
434
- "{} Uploaded {} image {}",
478
+ "{} Uploaded {} new image {}",
435
479
  style(">").dim(),
436
- style(total_count).yellow(),
437
- if total_count == 1 { "file" } else { "files" }
480
+ style(upload_count).yellow(),
481
+ if upload_count == 1 { "file" } else { "files" }
438
482
  );
439
483
  Ok(manifest_entries)
440
484
  }
@@ -18,7 +18,9 @@ use serde_json::Value;
18
18
  use crate::api::Api;
19
19
  use crate::config::Config;
20
20
  use crate::constants::DEFAULT_MAX_WAIT;
21
- use crate::utils::args::{validate_distribution, ArgExt as _};
21
+ use crate::utils::args::{
22
+ allow_xcode_infoplist_preprocessing_arg, validate_distribution, ArgExt as _,
23
+ };
22
24
  use crate::utils::file_search::ReleaseFileSearch;
23
25
  use crate::utils::file_upload::UploadContext;
24
26
  use crate::utils::fs::TempFile;
@@ -122,6 +124,7 @@ pub fn make_command(command: Command) -> Command {
122
124
  but at most for the given number of seconds.",
123
125
  ),
124
126
  )
127
+ .arg(allow_xcode_infoplist_preprocessing_arg())
125
128
  .arg(
126
129
  Arg::new("no_auto_release")
127
130
  .long("no-auto-release")
@@ -358,7 +361,9 @@ pub fn execute(matches: &ArgMatches) -> Result<()> {
358
361
  (Err(_), Err(_)) => {
359
362
  // Neither environment variable is present, attempt to parse Info.plist
360
363
  info!("Parsing Info.plist");
361
- match InfoPlist::discover_from_env() {
364
+ match InfoPlist::discover_from_env(
365
+ matches.get_flag("allow_xcode_infoplist_preprocessing"),
366
+ ) {
362
367
  Ok(Some(plist)) => {
363
368
  // Successfully discovered and parsed Info.plist
364
369
  let dist_string = plist.build().to_owned();
@@ -0,0 +1,19 @@
1
+ use anyhow::Result;
2
+ use clap::{ArgMatches, Command};
3
+
4
+ use crate::utils::args::allow_xcode_infoplist_preprocessing_arg;
5
+ use crate::utils::releases::detect_release_name;
6
+
7
+ pub fn make_command(command: Command) -> Command {
8
+ command
9
+ .about("Propose a version name for a new release.")
10
+ .arg(allow_xcode_infoplist_preprocessing_arg())
11
+ }
12
+
13
+ pub fn execute(matches: &ArgMatches) -> Result<()> {
14
+ println!(
15
+ "{}",
16
+ detect_release_name(matches.get_flag("allow_xcode_infoplist_preprocessing"))?
17
+ );
18
+ Ok(())
19
+ }
@@ -16,7 +16,9 @@ use serde_json::Value;
16
16
 
17
17
  use crate::api::envelopes_api::EnvelopesApi;
18
18
  use crate::constants::USER_AGENT;
19
- use crate::utils::args::{get_timestamp, validate_distribution};
19
+ use crate::utils::args::{
20
+ allow_xcode_infoplist_preprocessing_arg, get_timestamp, validate_distribution,
21
+ };
20
22
  use crate::utils::event::{attach_logfile, get_sdk_info};
21
23
  use crate::utils::releases::detect_release_name;
22
24
 
@@ -148,6 +150,7 @@ pub fn make_command(command: Command) -> Command {
148
150
  .long("logfile")
149
151
  .help(format!("Send a logfile as breadcrumbs with the event (last {MAX_BREADCRUMBS} records)")),
150
152
  )
153
+ .arg(allow_xcode_infoplist_preprocessing_arg())
151
154
  .arg(
152
155
  Arg::new("with_categories")
153
156
  .long("with-categories")
@@ -231,7 +234,11 @@ pub fn execute(matches: &ArgMatches) -> Result<()> {
231
234
  release: matches
232
235
  .get_one::<String>("release")
233
236
  .map(|s| Cow::Owned(s.clone()))
234
- .or_else(|| detect_release_name().ok().map(Cow::from)),
237
+ .or_else(|| {
238
+ detect_release_name(matches.get_flag("allow_xcode_infoplist_preprocessing"))
239
+ .ok()
240
+ .map(Cow::from)
241
+ }),
235
242
  dist: matches
236
243
  .get_one::<String>("dist")
237
244
  .map(|s| Cow::Owned(s.clone())),