sentry-cli 2.40.0__tar.gz → 2.41.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 (150) hide show
  1. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/Cargo.lock +15 -15
  2. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/Cargo.toml +2 -2
  3. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/PKG-INFO +2 -2
  4. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/sentry_cli.egg-info/PKG-INFO +2 -2
  5. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/sentry_cli.egg-info/SOURCES.txt +2 -1
  6. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/api/data_types/chunking/compression.rs +7 -19
  7. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/api/mod.rs +2 -3
  8. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/debug_files/bundle_jvm.rs +2 -1
  9. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/debug_files/bundle_sources.rs +1 -1
  10. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/files/upload.rs +2 -1
  11. sentry_cli-2.41.0/src/utils/dif_upload/error.rs +66 -0
  12. sentry_cli-2.40.0/src/utils/dif_upload.rs → sentry_cli-2.41.0/src/utils/dif_upload/mod.rs +39 -49
  13. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/file_search.rs +1 -1
  14. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/file_upload.rs +6 -4
  15. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/sourcemaps/inject.rs +1 -1
  16. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/sourcemaps.rs +25 -27
  17. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/LICENSE +0 -0
  18. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/MANIFEST.in +0 -0
  19. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/README.md +0 -0
  20. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/build.rs +0 -0
  21. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/pyproject.toml +0 -0
  22. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/sentry_cli.egg-info/dependency_links.txt +0 -0
  23. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/sentry_cli.egg-info/top_level.txt +0 -0
  24. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/setup.cfg +0 -0
  25. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/setup.py +0 -0
  26. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/api/connection_manager.rs +0 -0
  27. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/api/data_types/chunking/artifact.rs +0 -0
  28. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/api/data_types/chunking/dif.rs +0 -0
  29. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/api/data_types/chunking/file_state.rs +0 -0
  30. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/api/data_types/chunking/hash_algorithm.rs +0 -0
  31. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/api/data_types/chunking/mod.rs +0 -0
  32. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/api/data_types/chunking/upload/capability.rs +0 -0
  33. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/api/data_types/chunking/upload/mod.rs +0 -0
  34. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/api/data_types/chunking/upload/options.rs +0 -0
  35. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/api/data_types/deploy.rs +0 -0
  36. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/api/data_types/mod.rs +0 -0
  37. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/api/encoding.rs +0 -0
  38. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/api/envelopes_api.rs +0 -0
  39. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/api/errors/api_error.rs +0 -0
  40. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/api/errors/mod.rs +0 -0
  41. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/api/errors/sentry_error.rs +0 -0
  42. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/api/pagination.rs +0 -0
  43. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/bashsupport.sh +0 -0
  44. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/bash_hook.rs +0 -0
  45. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/debug_files/check.rs +0 -0
  46. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/debug_files/find.rs +0 -0
  47. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/debug_files/mod.rs +0 -0
  48. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/debug_files/print_sources.rs +0 -0
  49. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/debug_files/upload.rs +0 -0
  50. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/deploys/list.rs +0 -0
  51. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/deploys/mod.rs +0 -0
  52. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/deploys/new.rs +0 -0
  53. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/derive_parser.rs +0 -0
  54. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/events/list.rs +0 -0
  55. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/events/mod.rs +0 -0
  56. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/files/delete.rs +0 -0
  57. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/files/list.rs +0 -0
  58. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/files/mod.rs +0 -0
  59. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/info.rs +0 -0
  60. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/issues/list.rs +0 -0
  61. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/issues/mod.rs +0 -0
  62. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/issues/mute.rs +0 -0
  63. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/issues/resolve.rs +0 -0
  64. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/issues/unresolve.rs +0 -0
  65. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/login.rs +0 -0
  66. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/mod.rs +0 -0
  67. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/monitors/list.rs +0 -0
  68. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/monitors/mod.rs +0 -0
  69. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/monitors/run.rs +0 -0
  70. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/organizations/list.rs +0 -0
  71. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/organizations/mod.rs +0 -0
  72. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/projects/list.rs +0 -0
  73. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/projects/mod.rs +0 -0
  74. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/react_native/appcenter.rs +0 -0
  75. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/react_native/gradle.rs +0 -0
  76. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/react_native/mod.rs +0 -0
  77. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/react_native/xcode.rs +0 -0
  78. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/releases/archive.rs +0 -0
  79. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/releases/delete.rs +0 -0
  80. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/releases/finalize.rs +0 -0
  81. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/releases/info.rs +0 -0
  82. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/releases/list.rs +0 -0
  83. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/releases/mod.rs +0 -0
  84. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/releases/new.rs +0 -0
  85. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/releases/propose_version.rs +0 -0
  86. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/releases/restore.rs +0 -0
  87. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/releases/set_commits.rs +0 -0
  88. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/repos/list.rs +0 -0
  89. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/repos/mod.rs +0 -0
  90. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/send_envelope.rs +0 -0
  91. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/send_event.rs +0 -0
  92. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/send_metric/common_args.rs +0 -0
  93. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/send_metric/distribution.rs +0 -0
  94. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/send_metric/gauge.rs +0 -0
  95. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/send_metric/increment.rs +0 -0
  96. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/send_metric/mod.rs +0 -0
  97. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/send_metric/set.rs +0 -0
  98. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/sourcemaps/explain.rs +0 -0
  99. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/sourcemaps/inject.rs +0 -0
  100. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/sourcemaps/mod.rs +0 -0
  101. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/sourcemaps/resolve.rs +0 -0
  102. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/sourcemaps/upload.rs +0 -0
  103. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/uninstall.rs +0 -0
  104. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/update.rs +0 -0
  105. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/upload_dif.rs +0 -0
  106. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/upload_dsym.rs +0 -0
  107. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/commands/upload_proguard.rs +0 -0
  108. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/config.rs +0 -0
  109. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/constants.rs +0 -0
  110. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/main.rs +0 -0
  111. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/android.rs +0 -0
  112. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/appcenter.rs +0 -0
  113. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/args.rs +0 -0
  114. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/auth_token/auth_token_impl.rs +0 -0
  115. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/auth_token/error.rs +0 -0
  116. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/auth_token/mod.rs +0 -0
  117. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/auth_token/org_auth_token.rs +0 -0
  118. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/auth_token/redacting.rs +0 -0
  119. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/auth_token/test.rs +0 -0
  120. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/auth_token/user_auth_token.rs +0 -0
  121. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/chunks/mod.rs +0 -0
  122. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/chunks/options.rs +0 -0
  123. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/chunks/types.rs +0 -0
  124. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/chunks/upload.rs +0 -0
  125. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/cordova.rs +0 -0
  126. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/dif.rs +0 -0
  127. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/event.rs +0 -0
  128. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/formatting.rs +0 -0
  129. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/fs.rs +0 -0
  130. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/http.rs +0 -0
  131. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/logging.rs +0 -0
  132. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/metrics.rs +0 -0
  133. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/mod.rs +0 -0
  134. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/progress.rs +0 -0
  135. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/proguard/mapping.rs +0 -0
  136. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/proguard/mod.rs +0 -0
  137. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/proguard/upload.rs +0 -0
  138. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/releases.rs +0 -0
  139. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/retry.rs +0 -0
  140. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/snapshots/sentry_cli__utils__vcs__generate_patch_default_twenty.snap +0 -0
  141. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/snapshots/sentry_cli__utils__vcs__generate_patch_ignore_missing.snap +0 -0
  142. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/snapshots/sentry_cli__utils__vcs__generate_patch_set_base.snap +0 -0
  143. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/snapshots/sentry_cli__utils__vcs__generate_patch_set_previous_commit.snap +0 -0
  144. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/snapshots/sentry_cli__utils__vcs__get_commits_from_git.snap +0 -0
  145. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/system.rs +0 -0
  146. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/ui.rs +0 -0
  147. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/update.rs +0 -0
  148. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/value_parsers.rs +0 -0
  149. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/vcs.rs +0 -0
  150. {sentry_cli-2.40.0 → sentry_cli-2.41.0}/src/utils/xcode.rs +0 -0
@@ -1635,9 +1635,9 @@ checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
1635
1635
 
1636
1636
  [[package]]
1637
1637
  name = "memmap2"
1638
- version = "0.9.4"
1638
+ version = "0.9.5"
1639
1639
  source = "registry+https://github.com/rust-lang/crates.io-index"
1640
- checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322"
1640
+ checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f"
1641
1641
  dependencies = [
1642
1642
  "libc",
1643
1643
  ]
@@ -2561,7 +2561,7 @@ dependencies = [
2561
2561
 
2562
2562
  [[package]]
2563
2563
  name = "sentry-cli"
2564
- version = "2.40.0"
2564
+ version = "2.41.0"
2565
2565
  dependencies = [
2566
2566
  "anyhow",
2567
2567
  "anylog",
@@ -2900,9 +2900,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
2900
2900
 
2901
2901
  [[package]]
2902
2902
  name = "symbolic"
2903
- version = "12.12.3"
2903
+ version = "12.13.3"
2904
2904
  source = "registry+https://github.com/rust-lang/crates.io-index"
2905
- checksum = "c1ef4ac5c889f15a5adf61b10b6bc68b19172938243a697c9730e754e97ff0da"
2905
+ checksum = "691b8bd52ccf372a4cce381e62663530e0b96fb5f10e83477a8ec7d5cf421979"
2906
2906
  dependencies = [
2907
2907
  "symbolic-common",
2908
2908
  "symbolic-debuginfo",
@@ -2912,9 +2912,9 @@ dependencies = [
2912
2912
 
2913
2913
  [[package]]
2914
2914
  name = "symbolic-common"
2915
- version = "12.12.3"
2915
+ version = "12.13.3"
2916
2916
  source = "registry+https://github.com/rust-lang/crates.io-index"
2917
- checksum = "e5ba5365997a4e375660bed52f5b42766475d5bc8ceb1bb13fea09c469ea0f49"
2917
+ checksum = "13a4dfe4bbeef59c1f32fc7524ae7c95b9e1de5e79a43ce1604e181081d71b0c"
2918
2918
  dependencies = [
2919
2919
  "debugid",
2920
2920
  "memmap2",
@@ -2925,9 +2925,9 @@ dependencies = [
2925
2925
 
2926
2926
  [[package]]
2927
2927
  name = "symbolic-debuginfo"
2928
- version = "12.12.3"
2928
+ version = "12.13.3"
2929
2929
  source = "registry+https://github.com/rust-lang/crates.io-index"
2930
- checksum = "40ac2369b402eaa9c4ce0409094d803e7ee6b253c8bfe76d6057e13a4028d625"
2930
+ checksum = "474423ce25f811471ec4bd826511510df8a8895f6babd98f64524eda4a3978f4"
2931
2931
  dependencies = [
2932
2932
  "debugid",
2933
2933
  "elementtree",
@@ -2957,9 +2957,9 @@ dependencies = [
2957
2957
 
2958
2958
  [[package]]
2959
2959
  name = "symbolic-il2cpp"
2960
- version = "12.12.3"
2960
+ version = "12.13.3"
2961
2961
  source = "registry+https://github.com/rust-lang/crates.io-index"
2962
- checksum = "0048a96ed9341aa445084c5449b83f0c0e93710ba876662417bd92d7be780070"
2962
+ checksum = "c69a83048f5c49290be14a65c49eae124e51c175bfb81c75b520827e8bfc7526"
2963
2963
  dependencies = [
2964
2964
  "indexmap",
2965
2965
  "serde_json",
@@ -2969,9 +2969,9 @@ dependencies = [
2969
2969
 
2970
2970
  [[package]]
2971
2971
  name = "symbolic-ppdb"
2972
- version = "12.12.3"
2972
+ version = "12.13.3"
2973
2973
  source = "registry+https://github.com/rust-lang/crates.io-index"
2974
- checksum = "26c140c509e924792a140bc215cbd6851aef9036e06031f57370dbefb0ac4c51"
2974
+ checksum = "b4af715d3f52faa38f3acb92c33b4de6546c45565d9a5214338e22e040d6141e"
2975
2975
  dependencies = [
2976
2976
  "flate2",
2977
2977
  "indexmap",
@@ -2985,9 +2985,9 @@ dependencies = [
2985
2985
 
2986
2986
  [[package]]
2987
2987
  name = "symbolic-symcache"
2988
- version = "12.12.3"
2988
+ version = "12.13.3"
2989
2989
  source = "registry+https://github.com/rust-lang/crates.io-index"
2990
- checksum = "b63018a17d8c6c18ef70072572a41d79abfe4016a6222260cb93a865801c83d8"
2990
+ checksum = "68bf7bed4c5afea4766625b420a523a071a5142c61c0c7706a098a7b54823345"
2991
2991
  dependencies = [
2992
2992
  "indexmap",
2993
2993
  "symbolic-common",
@@ -2,7 +2,7 @@
2
2
  authors = ["Armin Ronacher <armin.ronacher@active-4.com>"]
3
3
  build = "build.rs"
4
4
  name = "sentry-cli"
5
- version = "2.40.0"
5
+ version = "2.41.0"
6
6
  edition = "2021"
7
7
  rust-version = "1.80"
8
8
 
@@ -66,7 +66,7 @@ serde = { version = "1.0.152", features = ["derive"] }
66
66
  serde_json = "1.0.93"
67
67
  sha1_smol = { version = "1.0.0", features = ["serde"] }
68
68
  sourcemap = { version = "9.1.2", features = ["ram_bundle"] }
69
- symbolic = { version = "12.12.3", features = ["debuginfo-serde", "il2cpp"] }
69
+ symbolic = { version = "12.13.3", features = ["debuginfo-serde", "il2cpp"] }
70
70
  thiserror = "1.0.38"
71
71
  url = "2.3.1"
72
72
  username = "0.2.0"
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: sentry_cli
3
- Version: 2.40.0
3
+ Version: 2.41.0
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
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: sentry_cli
3
- Version: 2.40.0
3
+ Version: 2.41.0
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
@@ -106,7 +106,6 @@ src/utils/appcenter.rs
106
106
  src/utils/args.rs
107
107
  src/utils/cordova.rs
108
108
  src/utils/dif.rs
109
- src/utils/dif_upload.rs
110
109
  src/utils/event.rs
111
110
  src/utils/file_search.rs
112
111
  src/utils/file_upload.rs
@@ -137,6 +136,8 @@ src/utils/chunks/mod.rs
137
136
  src/utils/chunks/options.rs
138
137
  src/utils/chunks/types.rs
139
138
  src/utils/chunks/upload.rs
139
+ src/utils/dif_upload/error.rs
140
+ src/utils/dif_upload/mod.rs
140
141
  src/utils/proguard/mapping.rs
141
142
  src/utils/proguard/mod.rs
142
143
  src/utils/proguard/upload.rs
@@ -1,16 +1,18 @@
1
1
  use std::fmt;
2
2
 
3
- use serde::{Deserialize, Deserializer};
3
+ use serde::Deserialize;
4
4
 
5
- #[derive(Debug, Clone, Copy, Ord, PartialOrd, Eq, PartialEq, Default)]
5
+ #[derive(Debug, Clone, Copy, Ord, PartialOrd, Eq, PartialEq, Default, Deserialize)]
6
+ #[serde(rename_all = "lowercase")]
6
7
  pub enum ChunkCompression {
7
- /// No compression should be applied
8
- #[default]
9
- Uncompressed = 0,
10
8
  /// GZIP compression (including header)
11
9
  Gzip = 10,
12
10
  /// Brotli compression
13
11
  Brotli = 20,
12
+ /// No compression should be applied
13
+ #[default]
14
+ #[serde(other)]
15
+ Uncompressed = 0,
14
16
  }
15
17
 
16
18
  impl ChunkCompression {
@@ -32,17 +34,3 @@ impl fmt::Display for ChunkCompression {
32
34
  }
33
35
  }
34
36
  }
35
-
36
- impl<'de> Deserialize<'de> for ChunkCompression {
37
- fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
38
- where
39
- D: Deserializer<'de>,
40
- {
41
- Ok(match String::deserialize(deserializer)?.as_str() {
42
- "gzip" => ChunkCompression::Gzip,
43
- "brotli" => ChunkCompression::Brotli,
44
- // We do not know this compression, so we assume no compression
45
- _ => ChunkCompression::Uncompressed,
46
- })
47
- }
48
- }
@@ -379,11 +379,10 @@ impl Api {
379
379
  // Curl stores a raw pointer to the stringified checksum internally. We first
380
380
  // transform all checksums to string and keep them in scope until the request
381
381
  // has completed. The original iterator is not needed anymore after this.
382
- let stringified_chunks: Vec<_> = chunks
382
+ let stringified_chunks = chunks
383
383
  .into_iter()
384
384
  .map(T::as_ref)
385
- .map(|&(checksum, data)| (checksum.to_string(), data))
386
- .collect();
385
+ .map(|&(checksum, data)| (checksum.to_string(), data));
387
386
 
388
387
  let mut form = curl::easy::Form::new();
389
388
  for (ref checksum, data) in stringified_chunks {
@@ -12,6 +12,7 @@ use std::collections::BTreeMap;
12
12
  use std::fs;
13
13
  use std::path::PathBuf;
14
14
  use std::str::FromStr;
15
+ use std::sync::Arc;
15
16
  use symbolic::debuginfo::sourcebundle::SourceFileType;
16
17
 
17
18
  pub fn make_command(command: Command) -> Command {
@@ -97,7 +98,7 @@ pub fn execute(matches: &ArgMatches) -> Result<()> {
97
98
  SourceFile {
98
99
  url,
99
100
  path: source.path.clone(),
100
- contents: source.contents.clone(),
101
+ contents: Arc::new(source.contents.clone()),
101
102
  ty: SourceFileType::Source,
102
103
  headers: BTreeMap::new(),
103
104
  messages: vec![],
@@ -32,7 +32,7 @@ pub fn make_command(command: Command) -> Command {
32
32
  }
33
33
 
34
34
  fn is_dsym(path: &Path) -> bool {
35
- path.extension().map_or(false, |e| e == "dSYM")
35
+ path.extension().is_some_and(|e| e == "dSYM")
36
36
  }
37
37
 
38
38
  fn get_sane_parent(path: &Path) -> &Path {
@@ -3,6 +3,7 @@ use std::ffi::OsStr;
3
3
  use std::fs;
4
4
  use std::io::Read;
5
5
  use std::path::Path;
6
+ use std::sync::Arc;
6
7
  use std::time::Duration;
7
8
 
8
9
  use anyhow::{bail, format_err, Result};
@@ -205,7 +206,7 @@ pub fn execute(matches: &ArgMatches) -> Result<()> {
205
206
  SourceFile {
206
207
  url,
207
208
  path: source.path.clone(),
208
- contents: source.contents.clone(),
209
+ contents: Arc::new(source.contents.clone()),
209
210
  ty: SourceFileType::Source,
210
211
  headers: headers.clone(),
211
212
  messages: vec![],
@@ -0,0 +1,66 @@
1
+ //! Error types for the dif_upload module.
2
+
3
+ use anyhow::Result;
4
+ use indicatif::HumanBytes;
5
+ use thiserror::Error;
6
+
7
+ /// Represents an error that makes a DIF invalid.
8
+ #[derive(Debug, Error)]
9
+ pub enum ValidationError {
10
+ #[error("Invalid format")]
11
+ InvalidFormat,
12
+ #[error("Invalid features")]
13
+ InvalidFeatures,
14
+ #[error("Invalid debug ID")]
15
+ InvalidDebugId,
16
+ #[error(
17
+ "Debug file's size ({}) exceeds the maximum allowed size ({})",
18
+ HumanBytes(*size as u64),
19
+ HumanBytes(*max_size)
20
+ )]
21
+ TooLarge { size: usize, max_size: u64 },
22
+ }
23
+
24
+ /// Handles a DIF validation error by logging it to console
25
+ /// at the appropriate log level. Or, if the error should stop
26
+ /// the upload, it will return an error, that can be propagated
27
+ /// to the caller.
28
+ pub fn handle(dif_name: &str, error: &ValidationError) -> Result<()> {
29
+ let message = format!("{}: {}", dif_name, error);
30
+ match error {
31
+ ValidationError::InvalidFormat
32
+ | ValidationError::InvalidFeatures
33
+ | ValidationError::InvalidDebugId => log::debug!("Skipping {message}"),
34
+ ValidationError::TooLarge { .. } => {
35
+ anyhow::bail!("Upload failed due to error in debug file {message}")
36
+ }
37
+ }
38
+
39
+ Ok(())
40
+ }
41
+
42
+ #[cfg(test)]
43
+ mod tests {
44
+ use super::*;
45
+
46
+ use rstest::rstest;
47
+
48
+ #[rstest]
49
+ #[case(ValidationError::InvalidFormat)]
50
+ #[case(ValidationError::InvalidFeatures)]
51
+ #[case(ValidationError::InvalidDebugId)]
52
+ fn test_handle_should_not_error(#[case] error: ValidationError) {
53
+ let result = handle("test", &error);
54
+ assert!(result.is_ok());
55
+ }
56
+
57
+ #[test]
58
+ fn test_handle_should_error() {
59
+ let error = ValidationError::TooLarge {
60
+ size: 1000,
61
+ max_size: 100,
62
+ };
63
+ let result = handle("test", &error);
64
+ assert!(result.is_err());
65
+ }
66
+ }
@@ -1,6 +1,8 @@
1
1
  //! Searches, processes and uploads debug information files (DIFs). See
2
2
  //! `DifUpload` for more information.
3
3
 
4
+ mod error;
5
+
4
6
  use std::borrow::Cow;
5
7
  use std::collections::{BTreeMap, BTreeSet};
6
8
  use std::convert::TryInto;
@@ -18,7 +20,6 @@ use std::time::Duration;
18
20
 
19
21
  use anyhow::{bail, format_err, Error, Result};
20
22
  use console::style;
21
- use indicatif::HumanBytes;
22
23
  use log::{debug, info, warn};
23
24
  use sha1_smol::Digest;
24
25
  use symbolic::common::{Arch, AsSelf, ByteView, DebugId, SelfCell, Uuid};
@@ -32,6 +33,7 @@ use which::which;
32
33
  use zip::result::ZipError;
33
34
  use zip::{write::FileOptions, ZipArchive, ZipWriter};
34
35
 
36
+ use self::error::ValidationError;
35
37
  use crate::api::{Api, ChunkServerOptions, ChunkUploadCapability};
36
38
  use crate::config::Config;
37
39
  use crate::constants::{DEFAULT_MAX_DIF_SIZE, DEFAULT_MAX_WAIT};
@@ -589,10 +591,7 @@ fn find_uuid_plists(
589
591
  // └─ DWARF
590
592
  // └─ App
591
593
  let plist_name = format!("{:X}.plist", uuid.as_hyphenated());
592
- let plist = match source.get_relative(format!("../{}", &plist_name)) {
593
- Some(plist) => plist,
594
- None => return None,
595
- };
594
+ let plist = source.get_relative(format!("../{}", &plist_name))?;
596
595
 
597
596
  let mut plists = BTreeMap::new();
598
597
  plists.insert(plist_name, plist);
@@ -656,14 +655,14 @@ fn search_difs(options: &DifUpload) -> Result<Vec<DifMatch<'static>>> {
656
655
 
657
656
  if Archive::peek(&buffer) != FileFormat::Unknown {
658
657
  let mut difs =
659
- collect_object_dif(source, name, buffer, options, &mut age_overrides);
658
+ collect_object_dif(source, name, buffer, options, &mut age_overrides)?;
660
659
  collected.append(difs.as_mut());
661
660
  } else if BcSymbolMap::test(&buffer) {
662
- if let Some(dif) = collect_auxdif(name, buffer, options, AuxDifKind::BcSymbolMap) {
661
+ if let Some(dif) = collect_auxdif(name, buffer, options, AuxDifKind::BcSymbolMap)? {
663
662
  collected.push(dif);
664
663
  }
665
664
  } else if buffer.starts_with(b"<?xml") {
666
- if let Some(dif) = collect_auxdif(name, buffer, options, AuxDifKind::UuidMap) {
665
+ if let Some(dif) = collect_auxdif(name, buffer, options, AuxDifKind::UuidMap)? {
667
666
  collected.push(dif);
668
667
  }
669
668
  };
@@ -729,7 +728,7 @@ fn collect_auxdif<'a>(
729
728
  buffer: ByteView<'static>,
730
729
  options: &DifUpload,
731
730
  kind: AuxDifKind,
732
- ) -> Option<DifMatch<'a>> {
731
+ ) -> Result<Option<DifMatch<'a>>> {
733
732
  let file_stem = Path::new(&name)
734
733
  .file_stem()
735
734
  .map(|stem| stem.to_string_lossy())
@@ -746,7 +745,7 @@ fn collect_auxdif<'a>(
746
745
  name = name
747
746
  );
748
747
  }
749
- return None;
748
+ return Ok(None);
750
749
  }
751
750
  };
752
751
  let dif_result = match kind {
@@ -762,16 +761,17 @@ fn collect_auxdif<'a>(
762
761
  name = name,
763
762
  err = err
764
763
  );
765
- return None;
764
+ return Ok(None);
766
765
  }
767
766
  };
768
767
 
769
768
  // Skip this file if we don't want to process it.
770
- if !options.validate_dif(&dif) {
771
- return None;
769
+ if let Err(e) = options.validate_dif(&dif) {
770
+ error::handle(&name, &e)?;
771
+ return Ok(None);
772
772
  }
773
773
 
774
- Some(dif)
774
+ Ok(Some(dif))
775
775
  }
776
776
 
777
777
  /// Processes and [`DifSource`] which is expected to be an object file.
@@ -781,7 +781,7 @@ fn collect_object_dif<'a>(
781
781
  buffer: ByteView<'static>,
782
782
  options: &DifUpload,
783
783
  age_overrides: &mut BTreeMap<Uuid, u32>,
784
- ) -> Vec<DifMatch<'a>> {
784
+ ) -> Result<Vec<DifMatch<'a>>> {
785
785
  let mut collected = Vec::with_capacity(2);
786
786
 
787
787
  // Try to parse a potential object file. If this is not possible,
@@ -796,7 +796,7 @@ fn collect_object_dif<'a>(
796
796
  format == FileFormat::Pe && options.valid_format(DifFormat::Object(FileFormat::Pdb));
797
797
 
798
798
  if !should_override_age && !options.valid_format(DifFormat::Object(format)) {
799
- return collected;
799
+ return Ok(collected);
800
800
  }
801
801
 
802
802
  debug!("trying to parse dif {}", name);
@@ -804,7 +804,7 @@ fn collect_object_dif<'a>(
804
804
  Ok(archive) => archive,
805
805
  Err(e) => {
806
806
  warn!("Skipping invalid debug file {}: {}", name, e);
807
- return collected;
807
+ return Ok(collected);
808
808
  }
809
809
  };
810
810
 
@@ -836,7 +836,9 @@ fn collect_object_dif<'a>(
836
836
  // If this is a PE file with an embedded Portable PDB, we extract and process the PPDB separately.
837
837
  if let Object::Pe(pe) = &object {
838
838
  if let Ok(Some(ppdb_dif)) = extract_embedded_ppdb(pe, name.as_str()) {
839
- if options.validate_dif(&ppdb_dif) {
839
+ if let Err(e) = options.validate_dif(&ppdb_dif) {
840
+ error::handle(&ppdb_dif.name, &e)?;
841
+ } else {
840
842
  collected.push(ppdb_dif);
841
843
  }
842
844
  }
@@ -878,14 +880,15 @@ fn collect_object_dif<'a>(
878
880
  };
879
881
 
880
882
  // Skip this file if we don't want to process it.
881
- if !options.validate_dif(&dif) {
883
+ if let Err(e) = options.validate_dif(&dif) {
884
+ error::handle(&name, &e)?;
882
885
  continue;
883
886
  }
884
887
 
885
888
  collected.push(dif);
886
889
  }
887
890
 
888
- collected
891
+ Ok(collected)
889
892
  }
890
893
 
891
894
  /// Resolves BCSymbolMaps and replaces hidden symbols in a `DifMatch` using
@@ -1691,7 +1694,7 @@ impl<'a> DifUpload<'a> {
1691
1694
 
1692
1695
  /// Determines if this file extension matches the search criteria.
1693
1696
  fn valid_extension(&self, ext: Option<&OsStr>) -> bool {
1694
- self.extensions.is_empty() || ext.map_or(false, |e| self.extensions.contains(e))
1697
+ self.extensions.is_empty() || ext.is_some_and(|e| self.extensions.contains(e))
1695
1698
  }
1696
1699
 
1697
1700
  /// Determines if this [`DifFormat`] matches the search criteria.
@@ -1723,21 +1726,13 @@ impl<'a> DifUpload<'a> {
1723
1726
  }
1724
1727
 
1725
1728
  /// Checks if a file is too large and logs skip message if so.
1726
- fn valid_size(&self, name: &str, size: usize) -> bool {
1729
+ fn valid_size(&self, size: usize) -> bool {
1727
1730
  let file_size: Result<u64, _> = size.try_into();
1728
- let too_large = match file_size {
1729
- Ok(file_size) => file_size > self.max_file_size,
1730
- Err(_) => true,
1731
- };
1732
- if too_large {
1733
- warn!(
1734
- "Skipping debug file since it exceeds {}: {} ({})",
1735
- HumanBytes(self.max_file_size),
1736
- name,
1737
- HumanBytes(file_size.unwrap_or(u64::MAX)),
1738
- );
1731
+
1732
+ match file_size {
1733
+ Ok(file_size) => file_size <= self.max_file_size,
1734
+ Err(_) => false, // Definitely too big
1739
1735
  }
1740
- !too_large
1741
1736
  }
1742
1737
 
1743
1738
  /// Validates DIF on whether it should be processed.
@@ -1745,33 +1740,28 @@ impl<'a> DifUpload<'a> {
1745
1740
  /// This takes all the filters configured in the [`DifUpload`] into account and returns
1746
1741
  /// whether a file should be skipped or not. It also takes care of logging such a skip
1747
1742
  /// if required.
1748
- fn validate_dif(&self, dif: &DifMatch) -> bool {
1749
- // Skip if we didn't want this kind of DIF.
1743
+ fn validate_dif(&self, dif: &DifMatch) -> Result<(), ValidationError> {
1750
1744
  if !self.valid_format(dif.format()) {
1751
- debug!("skipping {} because of format", dif.name);
1752
- return false;
1745
+ return Err(ValidationError::InvalidFormat);
1753
1746
  }
1754
1747
 
1755
- // Skip if this DIF does not have features we want.
1756
1748
  if !self.valid_features(dif) {
1757
- debug!("skipping {} because of features", dif.name);
1758
- return false;
1749
+ return Err(ValidationError::InvalidFeatures);
1759
1750
  }
1760
1751
 
1761
- // Skip if this DIF has no DebugId or we are only looking for certain IDs.
1762
1752
  let id = dif.debug_id.unwrap_or_default();
1763
1753
  if id.is_nil() || !self.valid_id(id) {
1764
- debug!("skipping {} because of debugid", dif.name);
1765
- return false;
1754
+ return Err(ValidationError::InvalidDebugId);
1766
1755
  }
1767
1756
 
1768
- // Skip if file exceeds the maximum allowed file size.
1769
- if !self.valid_size(&dif.name, dif.data().len()) {
1770
- debug!("skipping {} because of size", dif.name);
1771
- return false;
1757
+ if !self.valid_size(dif.data().len()) {
1758
+ return Err(ValidationError::TooLarge {
1759
+ size: dif.data().len(),
1760
+ max_size: self.max_file_size,
1761
+ });
1772
1762
  }
1773
1763
 
1774
- true
1764
+ Ok(())
1775
1765
  }
1776
1766
 
1777
1767
  fn into_chunk_options(self, server_options: ChunkServerOptions) -> ChunkOptions<'a> {
@@ -136,7 +136,7 @@ impl ReleaseFileSearch {
136
136
 
137
137
  for result in builder.build() {
138
138
  let file = result?;
139
- if file.file_type().map_or(false, |t| t.is_dir()) {
139
+ if file.file_type().is_some_and(|t| t.is_dir()) {
140
140
  continue;
141
141
  }
142
142
  pb.set_message(&format!("{}", file.path().display()));
@@ -42,7 +42,7 @@ pub fn initialize_legacy_release_upload(context: &UploadContext) -> Result<()> {
42
42
  // if a project is provided which is technically unnecessary for the
43
43
  // legacy upload though it will unlikely to be what users want.
44
44
  if context.project.is_some()
45
- && context.chunk_upload_options.map_or(false, |x| {
45
+ && context.chunk_upload_options.is_some_and(|x| {
46
46
  x.supports(ChunkUploadCapability::ArtifactBundles)
47
47
  || x.supports(ChunkUploadCapability::ArtifactBundlesV2)
48
48
  })
@@ -119,7 +119,7 @@ impl fmt::Display for LogLevel {
119
119
  pub struct SourceFile {
120
120
  pub url: String,
121
121
  pub path: PathBuf,
122
- pub contents: Vec<u8>,
122
+ pub contents: Arc<Vec<u8>>,
123
123
  pub ty: SourceFileType,
124
124
  /// A map of headers attached to the source file.
125
125
  ///
@@ -134,7 +134,7 @@ pub struct SourceFile {
134
134
  impl SourceFile {
135
135
  /// Calculates and returns the SHA1 checksum of the file.
136
136
  pub fn checksum(&self) -> Result<Digest> {
137
- get_sha1_checksum(&*self.contents)
137
+ get_sha1_checksum(&**self.contents)
138
138
  }
139
139
 
140
140
  /// Returns the value of the "debug-id" header.
@@ -670,7 +670,9 @@ mod tests {
670
670
  let file = SourceFile {
671
671
  url: format!("~/{name}"),
672
672
  path: format!("tests/integration/_fixtures/{name}").into(),
673
- contents: std::fs::read(format!("tests/integration/_fixtures/{name}")).unwrap(),
673
+ contents: std::fs::read(format!("tests/integration/_fixtures/{name}"))
674
+ .unwrap()
675
+ .into(),
674
676
  ty: SourceFileType::SourceMap,
675
677
  headers: Default::default(),
676
678
  messages: Default::default(),
@@ -284,7 +284,7 @@ pub fn find_matching_paths(candidate_paths: &[String], expected_path: &str) -> V
284
284
  while candidate_segments
285
285
  .peek()
286
286
  .zip(expected_segments.peek())
287
- .map_or(false, |(x, y)| x == y)
287
+ .is_some_and(|(x, y)| x == y)
288
288
  {
289
289
  candidate_segments.next();
290
290
  expected_segments.next();