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.
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/Cargo.lock +6 -5
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/Cargo.toml +3 -2
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/PKG-INFO +1 -1
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/sentry_cli.egg-info/PKG-INFO +1 -1
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/sentry_cli.egg-info/SOURCES.txt +1 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/mod.rs +7 -5
- sentry_cli-3.4.3/src/api/updating.rs +80 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/bashsupport.sh +3 -3
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/bash_hook.rs +44 -26
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/build/snapshots.rs +67 -23
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/react_native/xcode.rs +7 -2
- sentry_cli-3.4.3/src/commands/releases/propose_version.rs +19 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/send_event.rs +9 -2
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/config.rs +50 -10
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/args.rs +10 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/releases.rs +10 -6
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/update.rs +29 -4
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/xcode.rs +21 -8
- sentry_cli-3.4.2/src/commands/releases/propose_version.rs +0 -13
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/LICENSE +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/MANIFEST.in +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/README.md +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/apple-catalog-parsing/AGENTS.md +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/apple-catalog-parsing/CLAUDE.md +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/apple-catalog-parsing/Cargo.toml +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/apple-catalog-parsing/build.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/apple-catalog-parsing/native/swift/AssetCatalogParser/Package.swift +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/apple-catalog-parsing/native/swift/AssetCatalogParser/Sources/AssetCatalogParser/AssetCatalogReader.swift +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/apple-catalog-parsing/native/swift/AssetCatalogParser/Sources/ObjcSupport/include/safeValueForKey.h +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/apple-catalog-parsing/native/swift/AssetCatalogParser/Sources/ObjcSupport/safeValueForKey.m +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/apple-catalog-parsing/native/swift/AssetCatalogParser/Tests/AssetCatalogParserTests/AssetCatalogParserTests.swift +0 -0
- {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
- {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
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/apple-catalog-parsing/src/asset_catalog.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/apple-catalog-parsing/src/lib.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/build.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/pyproject.toml +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/sentry_cli.egg-info/dependency_links.txt +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/sentry_cli.egg-info/top_level.txt +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/setup.cfg +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/setup.py +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/AGENTS.md +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/CLAUDE.md +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/connection_manager.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/data_types/chunking/artifact.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/data_types/chunking/build.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/data_types/chunking/compression.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/data_types/chunking/dif.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/data_types/chunking/file_state.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/data_types/chunking/hash_algorithm.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/data_types/chunking/mod.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/data_types/chunking/upload/mod.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/data_types/chunking/upload/options.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/data_types/code_mappings.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/data_types/deploy.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/data_types/mod.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/data_types/snapshots.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/encoding.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/envelopes_api.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/errors/api_error.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/errors/mod.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/errors/sentry_error.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/pagination.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/api/serialization.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/build/download.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/build/mod.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/build/upload.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/code_mappings/mod.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/code_mappings/upload.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/dart_symbol_map/mod.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/dart_symbol_map/upload.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/debug_files/bundle_jvm.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/debug_files/bundle_sources.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/debug_files/check.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/debug_files/find.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/debug_files/mod.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/debug_files/print_sources.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/debug_files/upload.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/deploys/list.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/deploys/mod.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/deploys/new.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/derive_parser.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/events/list.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/events/mod.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/info.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/issues/list.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/issues/mod.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/issues/mute.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/issues/resolve.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/issues/unresolve.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/login.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/logs/list.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/logs/mod.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/mod.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/monitors/list.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/monitors/mod.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/monitors/run.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/organizations/list.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/organizations/mod.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/proguard/mod.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/proguard/upload.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/proguard/uuid.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/projects/list.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/projects/mod.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/react_native/gradle.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/react_native/mod.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/releases/archive.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/releases/delete.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/releases/finalize.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/releases/info.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/releases/list.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/releases/mod.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/releases/new.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/releases/restore.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/releases/set_commits.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/repos/list.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/repos/mod.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/send_envelope.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/send_metric/common_args.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/send_metric/increment.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/send_metric/mod.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/send_metric/set.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/sourcemaps/inject.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/sourcemaps/mod.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/sourcemaps/resolve.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/sourcemaps/upload.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/uninstall.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/update.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/upload_dif.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/upload_dsym.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/commands/upload_proguard.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/constants.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/main.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/android.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/auth_token/auth_token_impl.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/auth_token/error.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/auth_token/mod.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/auth_token/org_auth_token.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/auth_token/redacting.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/auth_token/test.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/auth_token/user_auth_token.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/build/apple.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/build/mod.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/build/normalize.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/build/validation.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/build_vcs.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/chunks/mod.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/chunks/options.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/chunks/types.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/chunks/upload.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/ci.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/cordova.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/dif.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/dif_upload/error.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/dif_upload/mod.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/event.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/file_search.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/file_upload.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/formatting.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/fs.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/http.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/logging.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/mod.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/non_empty.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/progress.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/proguard/mapping.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/proguard/mod.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/proguard/upload.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/retry.rs +0 -0
- {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
- {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
- {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
- {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
- {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
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/source_bundle.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/sourcemaps/inject.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/sourcemaps.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/system.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/ui.rs +0 -0
- {sentry_cli-3.4.2 → sentry_cli-3.4.3}/src/utils/value_parsers.rs +0 -0
- {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.
|
|
2303
|
+
version = "0.1.9"
|
|
2304
2304
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2305
|
-
checksum = "
|
|
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.
|
|
2326
|
+
version = "0.1.9"
|
|
2327
2327
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2328
|
-
checksum = "
|
|
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.
|
|
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.
|
|
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.
|
|
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"
|
|
@@ -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.
|
|
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
|
-
|
|
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,
|
|
1734
|
+
#[derive(Debug, Deserialize)]
|
|
1733
1735
|
struct RegistryRelease {
|
|
1734
1736
|
version: String,
|
|
1735
|
-
|
|
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
|
|
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=
|
|
2
|
-
_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"
|
|
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
|
|
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("
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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(
|
|
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
|
|
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
|
|
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
|
-
.
|
|
263
|
-
|
|
264
|
-
|
|
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("
|
|
271
|
-
script = script.replace(
|
|
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("
|
|
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
|
-
"{}
|
|
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
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
session
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
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
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
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(
|
|
437
|
-
if
|
|
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::{
|
|
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::{
|
|
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(||
|
|
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())),
|