Skip to content

feat(cli): add dsym upload command#43195

Merged
ioannisj merged 15 commits intomasterfrom
feat/cli-upload-dsym
Feb 16, 2026
Merged

feat(cli): add dsym upload command#43195
ioannisj merged 15 commits intomasterfrom
feat/cli-upload-dsym

Conversation

@ioannisj
Copy link
Contributor

Problem

Add CLI support to upload dSYM files through exp dsym upload subcommand

Changes

How did you test this code?

👉 Stay up-to-date with PostHog coding conventions for a smoother review.

Changelog: (features only) Is this feature complete?

@marandaneto
Copy link
Member

left a few questions related to this PR here as well

thiserror = "2.0.12"
tracing-subscriber = { version = "0.3.19", features = ["env-filter"] }
posthog-rs = { version = "0.3.5", default-features = false }
sha2 = "0.10.9"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remember to bump the version. It is described in ./cli/CONTRIBUTING.md

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this be done on this branch or on a release branch as described in ./cli/CONTRIBUTING.md btw?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On this branch.

Once you have required approvals and all is green etc, you can push the tag in the format described in that file to this branch and then merge this branch to master

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah but bump the version and update the lock file before that :)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pushing the tag will trigger a release immediately

@ioannisj ioannisj marked this pull request as ready for review December 22, 2025 15:10
@ioannisj
Copy link
Contributor Author

Hey guys, tried to address all the comments above so when you have a chance please have another look. We won't be using this right now, not until we start working on symbolication, so we may probably revisit anw

Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No issues found across 6 files

Copy link
Contributor

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

5 files reviewed, 3 comments

Edit Code Review Agent Settings | Greptile

Copy link
Contributor

@ablaszkiewicz ablaszkiewicz left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to me. Agree that we can revisit this

@ioannisj
Copy link
Contributor Author

Looks like release has failed here https://github.com/PostHog/posthog/actions/runs/20460693242

@hpouillot
Copy link
Contributor

Release workflow has been fixed, for context: https://posthog.slack.com/archives/C0113360FFV/p1767019809101999

@github-actions
Copy link
Contributor

This PR hasn't seen activity in a week! Should it be merged, closed, or further worked on? If you want to keep it open, post a comment or remove the stale label – otherwise this will be closed in another week. If you want to permanentely keep it open, use the waiting label.

@github-actions github-actions bot added the stale label Jan 13, 2026
@github-actions
Copy link
Contributor

This PR was closed due to lack of activity. Feel free to reopen if it's still relevant.

@github-actions github-actions bot closed this Jan 20, 2026
@ioannisj ioannisj reopened this Jan 20, 2026
Copy link
Contributor

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

6 files reviewed, 4 comments

Edit Code Review Agent Settings | Greptile

Comment on lines +57 to +66
pub fn into_uploads(self) -> Vec<SymbolSetUpload> {
self.uuids
.into_iter()
.map(|uuid| SymbolSetUpload {
chunk_id: uuid,
release_id: self.release_id.clone(),
data: self.data.clone(),
})
.collect()
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

logic: For universal binaries with multiple architectures, cloning self.data for each UUID creates N full copies of potentially large dSYM data in memory. Consider using Arc<Vec<u8>> to share the data across uploads instead of cloning.

Suggested change
pub fn into_uploads(self) -> Vec<SymbolSetUpload> {
self.uuids
.into_iter()
.map(|uuid| SymbolSetUpload {
chunk_id: uuid,
release_id: self.release_id.clone(),
data: self.data.clone(),
})
.collect()
}
impl DsymFile {
/// Convert to SymbolSetUploads (one per UUID/architecture)
pub fn into_uploads(self) -> Vec<SymbolSetUpload> {
let data = std::sync::Arc::new(self.data);
self.uuids
.into_iter()
.map(|uuid| SymbolSetUpload {
chunk_id: uuid,
release_id: self.release_id.clone(),
data: (*data).clone(), // Still need the Vec for API, but Arc avoids duplication
})
.collect()
}
}

Note: If SymbolSetUpload is refactored to use Arc<Vec<u8>>, this becomes cleaner.

Prompt To Fix With AI
This is a comment left during a code review.
Path: cli/src/dsym/mod.rs
Line: 57:66

Comment:
**logic:** For universal binaries with multiple architectures, cloning `self.data` for each UUID creates N full copies of potentially large dSYM data in memory. Consider using `Arc<Vec<u8>>` to share the data across uploads instead of cloning.

```suggestion
impl DsymFile {
    /// Convert to SymbolSetUploads (one per UUID/architecture)
    pub fn into_uploads(self) -> Vec<SymbolSetUpload> {
        let data = std::sync::Arc::new(self.data);
        self.uuids
            .into_iter()
            .map(|uuid| SymbolSetUpload {
                chunk_id: uuid,
                release_id: self.release_id.clone(),
                data: (*data).clone(),  // Still need the Vec for API, but Arc avoids duplication
            })
            .collect()
    }
}
```

Note: If `SymbolSetUpload` is refactored to use `Arc<Vec<u8>>`, this becomes cleaner.

How can I resolve this? If you propose a fix, please make it concise.

Comment on lines +117 to +127
let resolved_project = project.clone().or_else(|| {
plist_info
.as_ref()
.and_then(|p| p.bundle_identifier.clone())
});
let resolved_version = version
.clone()
.or_else(|| plist_info.as_ref().and_then(|p| p.short_version.clone()));
let resolved_build = build
.clone()
.or_else(|| plist_info.as_ref().and_then(|p| p.bundle_version.clone()));
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

style: Unnecessary clone operations - resolved_project, resolved_version, and resolved_build are already Option<String> and only used once after cloning. Use .as_ref() or reference the original options directly instead.

Suggested change
let resolved_project = project.clone().or_else(|| {
plist_info
.as_ref()
.and_then(|p| p.bundle_identifier.clone())
});
let resolved_version = version
.clone()
.or_else(|| plist_info.as_ref().and_then(|p| p.short_version.clone()));
let resolved_build = build
.clone()
.or_else(|| plist_info.as_ref().and_then(|p| p.bundle_version.clone()));
// Determine project, version, build - CLI args take precedence over plist
let resolved_project = project.as_ref().or_else(|| {
plist_info
.as_ref()
.and_then(|p| p.bundle_identifier.as_ref())
});
let resolved_version = version
.as_ref()
.or_else(|| plist_info.as_ref().and_then(|p| p.short_version.as_ref()));
let resolved_build = build
.as_ref()
.or_else(|| plist_info.as_ref().and_then(|p| p.bundle_version.as_ref()));
Prompt To Fix With AI
This is a comment left during a code review.
Path: cli/src/dsym/upload.rs
Line: 117:127

Comment:
**style:** Unnecessary clone operations - `resolved_project`, `resolved_version`, and `resolved_build` are already `Option<String>` and only used once after cloning. Use `.as_ref()` or reference the original options directly instead.

```suggestion
    // Determine project, version, build - CLI args take precedence over plist
    let resolved_project = project.as_ref().or_else(|| {
        plist_info
            .as_ref()
            .and_then(|p| p.bundle_identifier.as_ref())
    });
    let resolved_version = version
        .as_ref()
        .or_else(|| plist_info.as_ref().and_then(|p| p.short_version.as_ref()));
    let resolved_build = build
        .as_ref()
        .or_else(|| plist_info.as_ref().and_then(|p| p.bundle_version.as_ref()));
```

How can I resolve this? If you propose a fix, please make it concise.

Comment on lines +131 to +133
// Create relative path within the zip
let relative_path = path.strip_prefix(dsym_path.parent().unwrap_or(dsym_path))?;
let zip_path = relative_path.to_string_lossy();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

logic: The relative path calculation uses dsym_path.parent() as the strip prefix, which includes the parent directory in the zip. This appears incorrect - to preserve just the .dSYM bundle name (as intended by zip structure), strip relative to parent and include the bundle name itself.

Suggested change
// Create relative path within the zip
let relative_path = path.strip_prefix(dsym_path.parent().unwrap_or(dsym_path))?;
let zip_path = relative_path.to_string_lossy();
// Create relative path within the zip (preserves .dSYM bundle name)
let relative_path = path.strip_prefix(dsym_path.parent().unwrap_or(dsym_path))?;

However, verify that the intended structure is MyApp.app.dSYM/Contents/... in the zip and not just Contents/....

Prompt To Fix With AI
This is a comment left during a code review.
Path: cli/src/dsym/mod.rs
Line: 131:133

Comment:
**logic:** The relative path calculation uses `dsym_path.parent()` as the strip prefix, which includes the parent directory in the zip. This appears incorrect - to preserve just the `.dSYM` bundle name (as intended by zip structure), strip relative to parent and include the bundle name itself.

```suggestion
            // Create relative path within the zip (preserves .dSYM bundle name)
            let relative_path = path.strip_prefix(dsym_path.parent().unwrap_or(dsym_path))?;
```

However, verify that the intended structure is `MyApp.app.dSYM/Contents/...` in the zip and not just `Contents/...`.

How can I resolve this? If you propose a fix, please make it concise.

Comment on lines +131 to +133
// Create relative path within the zip
let relative_path = path.strip_prefix(dsym_path.parent().unwrap_or(dsym_path))?;
let zip_path = relative_path.to_string_lossy();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

style: The relative path includes both the .dSYM bundle name and its contents in the zip archive. This is correct but worth documenting - verify that downstream processing expects the full bundle structure (e.g., MyApp.app.dSYM/Contents/...) and not just the contents.

Prompt To Fix With AI
This is a comment left during a code review.
Path: cli/src/dsym/mod.rs
Line: 131:133

Comment:
**style:** The relative path includes both the `.dSYM` bundle name and its contents in the zip archive. This is correct but worth documenting - verify that downstream processing expects the full bundle structure (e.g., `MyApp.app.dSYM/Contents/...`) and not just the contents.

How can I resolve this? If you propose a fix, please make it concise.

@github-actions github-actions bot removed the stale label Jan 21, 2026
@github-actions
Copy link
Contributor

github-actions bot commented Feb 4, 2026

This PR hasn't seen activity in a week! Should it be merged, closed, or further worked on? If you want to keep it open, post a comment or remove the stale label – otherwise this will be closed in another week. If you want to permanentely keep it open, use the waiting label.

@github-actions github-actions bot added the stale label Feb 4, 2026
@github-actions
Copy link
Contributor

This PR was closed due to lack of activity. Feel free to reopen if it's still relevant.

@github-actions github-actions bot closed this Feb 12, 2026
@ioannisj ioannisj removed the stale label Feb 15, 2026
@ioannisj ioannisj reopened this Feb 15, 2026
Copy link
Contributor

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

7 files reviewed, 1 comment

Edit Code Review Agent Settings | Greptile

Comment on lines +147 to +150
// Add git info as metadata if available (but don't use it for project/version)
if let Ok(Some(git_info)) = get_git_info(Some(directory.clone())) {
release_builder.with_git(git_info);
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Git info leaks into project/version

The comment says "don't use it for project/version," but ReleaseBuilder::with_git() sets project to the git remote URL and version to the commit SHA when the builder is empty (which it always is here, since it's created via default() on line 145). The overrides on lines 157-162 only apply when resolved_project / full_version are Some.

This means if neither CLI args nor the plist provide a project or version, the release will silently be created with the git remote URL as "project" and the commit SHA as "version" — which is semantically incorrect for an iOS dSYM upload and contradicts the stated intent.

To match the comment's intent, use with_metadata directly to attach git info without populating project/version:

Suggested change
// Add git info as metadata if available (but don't use it for project/version)
if let Ok(Some(git_info)) = get_git_info(Some(directory.clone())) {
release_builder.with_git(git_info);
}
// Add git info as metadata if available (but don't use it for project/version)
if let Ok(Some(git_info)) = get_git_info(Some(directory.clone())) {
let _ = release_builder.with_metadata("git", git_info);
}
Prompt To Fix With AI
This is a comment left during a code review.
Path: cli/src/dsym/upload.rs
Line: 147:150

Comment:
**Git info leaks into project/version**

The comment says "don't use it for project/version," but `ReleaseBuilder::with_git()` sets `project` to the git remote URL and `version` to the commit SHA when the builder is empty (which it always is here, since it's created via `default()` on line 145). The overrides on lines 157-162 only apply when `resolved_project` / `full_version` are `Some`.

This means if neither CLI args nor the plist provide a project or version, the release will silently be created with the git remote URL as "project" and the commit SHA as "version" — which is semantically incorrect for an iOS dSYM upload and contradicts the stated intent.

To match the comment's intent, use `with_metadata` directly to attach git info without populating project/version:

```suggestion
    // Add git info as metadata if available (but don't use it for project/version)
    if let Ok(Some(git_info)) = get_git_info(Some(directory.clone())) {
        let _ = release_builder.with_metadata("git", git_info);
    }
```

How can I resolve this? If you propose a fix, please make it concise.

# Conflicts:
#	cli/CHANGELOG.md
#	cli/Cargo.lock
#	cli/Cargo.toml
@github-actions
Copy link
Contributor

github-actions bot commented Feb 16, 2026

Size Change: 0 B

Total Size: 93.5 MB

ℹ️ View Unchanged
Filename Size
frontend/dist/1c 160 kB
frontend/dist/368Hedgehogs 5.91 kB
frontend/dist/abap 145 B
frontend/dist/abnf 145 B
frontend/dist/accesslog 1.04 kB
frontend/dist/Action 21 kB
frontend/dist/Actions 1.68 kB
frontend/dist/actionscript 153 B
frontend/dist/ada 144 B
frontend/dist/AdvancedActivityLogsScene 34.5 kB
frontend/dist/agda 145 B
frontend/dist/al 143 B
frontend/dist/angelscript 1.73 kB
frontend/dist/antlr4 147 B
frontend/dist/apache 1.05 kB
frontend/dist/apacheconf 151 B
frontend/dist/apex 179 B
frontend/dist/apl 144 B
frontend/dist/applescript 152 B
frontend/dist/ApprovalDetail 16.8 kB
frontend/dist/AppsScene 3.08 kB
frontend/dist/aql 144 B
frontend/dist/arcade 2.94 kB
frontend/dist/arduino 8.88 kB
frontend/dist/arff 145 B
frontend/dist/armasm 3.27 kB
frontend/dist/array.full.es5.js 321 kB
frontend/dist/array.full.js 421 kB
frontend/dist/array.js 176 kB
frontend/dist/asciidoc 149 B
frontend/dist/asm6502 148 B
frontend/dist/asmatmel 149 B
frontend/dist/aspectj 2.69 kB
frontend/dist/aspnet 181 B
frontend/dist/AsyncMigrations 13.8 kB
frontend/dist/AuthorizationStatus 1.36 kB
frontend/dist/autohotkey 1.04 kB
frontend/dist/autoit 6.74 kB
frontend/dist/avisynth 149 B
frontend/dist/avrasm 2.1 kB
frontend/dist/avro-idl 149 B
frontend/dist/awk 804 B
frontend/dist/axapta 1.76 kB
frontend/dist/azcli 852 B
frontend/dist/bash 2.18 kB
frontend/dist/basic 146 B
frontend/dist/bat 1.85 kB
frontend/dist/batch 146 B
frontend/dist/BatchExportScene 50.6 kB
frontend/dist/bbcode 147 B
frontend/dist/bicep 2.56 kB
frontend/dist/Billing 1.14 kB
frontend/dist/BillingSection 21.4 kB
frontend/dist/birb 145 B
frontend/dist/bison 180 B
frontend/dist/bnf 144 B
frontend/dist/brainfuck 150 B
frontend/dist/brightscript 153 B
frontend/dist/bro 144 B
frontend/dist/bsl 144 B
frontend/dist/c-like 5.27 kB
frontend/dist/c 142 B
frontend/dist/cal 1.12 kB
frontend/dist/CalendarHeatMap 5.44 kB
frontend/dist/cameligo 2.2 kB
frontend/dist/capnproto 974 B
frontend/dist/ceylon 1.24 kB
frontend/dist/cfscript 149 B
frontend/dist/chaiscript 219 B
frontend/dist/changeRequestsLogic 1.19 kB
frontend/dist/cil 144 B
frontend/dist/clean 671 B
frontend/dist/CLIAuthorize 10.9 kB
frontend/dist/clike 146 B
frontend/dist/clojure 3.76 kB
frontend/dist/clojure-repl 326 B
frontend/dist/cmake 146 B
frontend/dist/cobol 146 B
frontend/dist/coffee 3.6 kB
frontend/dist/coffeescript 153 B
frontend/dist/Cohort 23.5 kB
frontend/dist/CohortCalculationHistory 6.88 kB
frontend/dist/Cohorts 10 kB
frontend/dist/concurnas 150 B
frontend/dist/ConfirmOrganization 5.14 kB
frontend/dist/conversations.js 46.2 kB
frontend/dist/coq 3.61 kB
frontend/dist/core 315 B
frontend/dist/cos 1.46 kB
frontend/dist/Coupons 1.38 kB
frontend/dist/cpp 5.31 kB
frontend/dist/Create 1.31 kB
frontend/dist/crisp-chat-integration.js 2.11 kB
frontend/dist/crmsh 1.53 kB
frontend/dist/crystal 182 B
frontend/dist/csharp 147 B
frontend/dist/cshtml 181 B
frontend/dist/csp 571 B
frontend/dist/css 4.51 kB
frontend/dist/css-extras 151 B
frontend/dist/cssMode 4.14 kB
frontend/dist/csv 144 B
frontend/dist/CustomCssScene 4.2 kB
frontend/dist/CustomerAnalyticsConfigurationScene 2.64 kB
frontend/dist/CustomerAnalyticsScene 31.4 kB
frontend/dist/customizations.full.js 18 kB
frontend/dist/cypher 3.4 kB
frontend/dist/d 142 B
frontend/dist/dart 4.26 kB
frontend/dist/Dashboard 1.58 kB
frontend/dist/Dashboards 14 kB
frontend/dist/DataManagementScene 1.29 kB
frontend/dist/DataPipelinesNewScene 2.96 kB
frontend/dist/DataWarehouseScene 1.4 kB
frontend/dist/DataWarehouseSourceScene 1.31 kB
frontend/dist/dataweave 150 B
frontend/dist/dax 144 B
frontend/dist/Deactivated 1.78 kB
frontend/dist/dead-clicks-autocapture.js 13.1 kB
frontend/dist/DeadLetterQueue 6.04 kB
frontend/dist/DebugScene 19.2 kB
frontend/dist/decompressionWorker 2.85 kB
frontend/dist/decompressionWorker.js 2.85 kB
frontend/dist/DefinitionEdit 6.13 kB
frontend/dist/DefinitionView 21.2 kB
frontend/dist/delphi 2.1 kB
frontend/dist/DestinationsScene 3.29 kB
frontend/dist/dhall 146 B
frontend/dist/diff 145 B
frontend/dist/django 181 B
frontend/dist/dns 1.88 kB
frontend/dist/dns-zone-file 154 B
frontend/dist/docker 147 B
frontend/dist/dockerfile 1.88 kB
frontend/dist/dos 1.3 kB
frontend/dist/dot 144 B
frontend/dist/dsconfig 724 B
frontend/dist/dts 1.47 kB
frontend/dist/dust 585 B
frontend/dist/EarlyAccessFeature 1.36 kB
frontend/dist/EarlyAccessFeatures 3.49 kB
frontend/dist/ebnf 145 B
frontend/dist/ecl 5.35 kB
frontend/dist/editorconfig 153 B
frontend/dist/EditorScene 211 kB
frontend/dist/eiffel 147 B
frontend/dist/ejs 178 B
frontend/dist/elixir 10.3 kB
frontend/dist/elm 144 B
frontend/dist/EmailMFAVerify 3.63 kB
frontend/dist/EndpointScene 30.3 kB
frontend/dist/EndpointsScene 19 kB
frontend/dist/erb 344 B
frontend/dist/erlang 2.09 kB
frontend/dist/erlang-repl 1.01 kB
frontend/dist/ErrorTrackingConfigurationScene 2.69 kB
frontend/dist/ErrorTrackingIssueFingerprintsScene 5.98 kB
frontend/dist/ErrorTrackingIssueScene 78.9 kB
frontend/dist/ErrorTrackingScene 11.9 kB
frontend/dist/etlua 214 B
frontend/dist/EvaluationTemplates 1.25 kB
frontend/dist/EventsScene 3.1 kB
frontend/dist/excel-formula 154 B
frontend/dist/excel 4.45 kB
frontend/dist/exception-autocapture.js 11.9 kB
frontend/dist/Experiment 255 kB
frontend/dist/Experiments 17.8 kB
frontend/dist/exporter 18 MB
frontend/dist/exporter.js 18 MB
frontend/dist/ExportsScene 4.52 kB
frontend/dist/factor 147 B
frontend/dist/false 146 B
frontend/dist/FeatureFlag 86.8 kB
frontend/dist/FeatureFlags 1.22 kB
frontend/dist/firestore-security-rules 165 B
frontend/dist/fix 529 B
frontend/dist/FlappyHog 6.43 kB
frontend/dist/flix 756 B
frontend/dist/flow 145 B
frontend/dist/flow9 1.81 kB
frontend/dist/fortran 148 B
frontend/dist/freemarker2 16.7 kB
frontend/dist/fsharp 2.99 kB
frontend/dist/ftl 178 B
frontend/dist/gams 3.17 kB
frontend/dist/gap 144 B
frontend/dist/gauss 13.1 kB
frontend/dist/gcode 146 B
frontend/dist/gdscript 149 B
frontend/dist/gedcom 147 B
frontend/dist/gherkin 670 B
frontend/dist/git 144 B
frontend/dist/glsl 179 B
frontend/dist/gml 144 B
frontend/dist/gn 143 B
frontend/dist/go 143 B
frontend/dist/go-module 150 B
frontend/dist/golo 677 B
frontend/dist/gradle 1.68 kB
frontend/dist/graphql 2.27 kB
frontend/dist/groovy 1.73 kB
frontend/dist/Group 15 kB
frontend/dist/Groups 6.27 kB
frontend/dist/GroupsNew 8 kB
frontend/dist/haml 179 B
frontend/dist/handlebars 2.51 kB
frontend/dist/haskell 1.82 kB
frontend/dist/haxe 2.01 kB
frontend/dist/hcl 3.6 kB
frontend/dist/HealthScene 2.81 kB
frontend/dist/HeatmapNewScene 4.82 kB
frontend/dist/HeatmapRecordingScene 4.55 kB
frontend/dist/HeatmapScene 6.56 kB
frontend/dist/HeatmapsScene 4.53 kB
frontend/dist/hlsl 179 B
frontend/dist/HogFunctionScene 59.7 kB
frontend/dist/HogRepl 8.02 kB
frontend/dist/hoon 145 B
frontend/dist/hpkp 145 B
frontend/dist/hsp 3.51 kB
frontend/dist/hsts 145 B
frontend/dist/html 5.56 kB
frontend/dist/htmlbars 2.62 kB
frontend/dist/htmlMode 4.6 kB
frontend/dist/http 1.04 kB
frontend/dist/hy 3.08 kB
frontend/dist/ichigojam 150 B
frontend/dist/icon 145 B
frontend/dist/icu-message-format 159 B
frontend/dist/idris 180 B
frontend/dist/iecst 146 B
frontend/dist/ignore 147 B
frontend/dist/image-blob-reduce.esm 49.4 kB
frontend/dist/InboxScene 7.7 kB
frontend/dist/index 309 kB
frontend/dist/index.js 309 kB
frontend/dist/inform7 802 B
frontend/dist/ini 1.11 kB
frontend/dist/InsightOptions 5.41 kB
frontend/dist/InsightScene 23.6 kB
frontend/dist/IntegrationsRedirect 1.39 kB
frontend/dist/intercom-integration.js 2.16 kB
frontend/dist/InviteSignup 14 kB
frontend/dist/io 143 B
frontend/dist/irpf90 4.94 kB
frontend/dist/isbl 83.8 kB
frontend/dist/j 142 B
frontend/dist/java 2.69 kB
frontend/dist/javadoc 216 B
frontend/dist/javadoclike 152 B
frontend/dist/javascript 962 B
frontend/dist/javastacktrace 155 B
frontend/dist/jboss-cli 1.02 kB
frontend/dist/jexl 145 B
frontend/dist/jolie 146 B
frontend/dist/jq 143 B
frontend/dist/js-extras 150 B
frontend/dist/js-templates 153 B
frontend/dist/jsdoc 214 B
frontend/dist/json 714 B
frontend/dist/json5 180 B
frontend/dist/jsonMode 13.9 kB
frontend/dist/jsonp 180 B
frontend/dist/jsstacktrace 153 B
frontend/dist/jsx 144 B
frontend/dist/julia-repl 353 B
frontend/dist/julia 7.24 kB
frontend/dist/keepalived 151 B
frontend/dist/keyman 147 B
frontend/dist/kotlin 147 B
frontend/dist/kumir 146 B
frontend/dist/kusto 146 B
frontend/dist/lasso 3.07 kB
frontend/dist/latex 3.68 kB
frontend/dist/latte 214 B
frontend/dist/lazy 152 kB
frontend/dist/ldif 475 B
frontend/dist/leaf 564 B
frontend/dist/LegacyPluginScene 21.7 kB
frontend/dist/LemonDialog 1.13 kB
frontend/dist/less 7.7 kB
frontend/dist/lexon 2.45 kB
frontend/dist/lib 2.23 kB
frontend/dist/lilypond 183 B
frontend/dist/LinkScene 25.5 kB
frontend/dist/LinksScene 4.86 kB
frontend/dist/liquid 4.51 kB
frontend/dist/lisp 1.27 kB
frontend/dist/livecodeserver 8.34 kB
frontend/dist/LiveDebugger 19.8 kB
frontend/dist/LiveEventsTable 4.59 kB
frontend/dist/livescript 3.54 kB
frontend/dist/LLMAnalyticsClusterScene 16.3 kB
frontend/dist/LLMAnalyticsClustersScene 35.9 kB
frontend/dist/LLMAnalyticsDatasetScene 20.2 kB
frontend/dist/LLMAnalyticsDatasetsScene 3.87 kB
frontend/dist/LLMAnalyticsEvaluation 35.3 kB
frontend/dist/LLMAnalyticsEvaluationsScene 19.7 kB
frontend/dist/LLMAnalyticsPlaygroundScene 1.2 kB
frontend/dist/LLMAnalyticsScene 41.4 kB
frontend/dist/LLMAnalyticsSessionScene 12.5 kB
frontend/dist/LLMAnalyticsTraceScene 96.2 kB
frontend/dist/LLMAnalyticsUsers 1.17 kB
frontend/dist/LLMASessionFeedbackDisplay 5.49 kB
frontend/dist/LLMPromptScene 11.6 kB
frontend/dist/LLMPromptsScene 3.88 kB
frontend/dist/llvm 145 B
frontend/dist/log 144 B
frontend/dist/Login 9.02 kB
frontend/dist/Login2FA 4.86 kB
frontend/dist/logs.js 39 kB
frontend/dist/LogsScene 109 kB
frontend/dist/lolcode 148 B
frontend/dist/lsl 12 kB
frontend/dist/lua 2 kB
frontend/dist/m3 2.82 kB
frontend/dist/magma 146 B
frontend/dist/makefile 1.2 kB
frontend/dist/ManagedMigration 14.7 kB
frontend/dist/markdown 3.79 kB
frontend/dist/MarketingAnalyticsScene 24.1 kB
frontend/dist/markup-templating 158 B
frontend/dist/markup 147 B
frontend/dist/MaterializedColumns 10.8 kB
frontend/dist/mathematica 113 kB
frontend/dist/matlab 147 B
frontend/dist/Max 1.31 kB
frontend/dist/maxima 28.8 kB
frontend/dist/maxscript 150 B
frontend/dist/mdx 5.36 kB
frontend/dist/mel 16.7 kB
frontend/dist/mercury 2.19 kB
frontend/dist/mermaid 148 B
frontend/dist/MessageTemplate 16.9 kB
frontend/dist/mips 2.59 kB
frontend/dist/mipsasm 2.58 kB
frontend/dist/mizar 856 B
frontend/dist/ModelsScene 2.36 kB
frontend/dist/mojolicious 443 B
frontend/dist/mongodb 148 B
frontend/dist/monkey 1.46 kB
frontend/dist/moonscript 151 B
frontend/dist/MoveToPostHogCloud 5.1 kB
frontend/dist/msdax 4.92 kB
frontend/dist/mysql 11.3 kB
frontend/dist/n1ql 3.12 kB
frontend/dist/n4js 145 B
frontend/dist/nand2tetris-hdl 156 B
frontend/dist/naniscript 151 B
frontend/dist/nasm 145 B
frontend/dist/neon 145 B
frontend/dist/nevod 146 B
frontend/dist/NewSourceWizard 1.4 kB
frontend/dist/NewTabScene 1.26 kB
frontend/dist/nginx 1.51 kB
frontend/dist/nim 144 B
frontend/dist/nix 770 B
frontend/dist/node-repl 369 B
frontend/dist/NotebookCanvasScene 3.67 kB
frontend/dist/NotebookScene 8.71 kB
frontend/dist/NotebooksScene 8.18 kB
frontend/dist/nsis 145 B
frontend/dist/OAuthAuthorize 10.3 kB
frontend/dist/objective-c 2.42 kB
frontend/dist/objectivec 2.67 kB
frontend/dist/ocaml 146 B
frontend/dist/Onboarding 757 kB
frontend/dist/OnboardingCouponRedemption 1.84 kB
frontend/dist/opencl 181 B
frontend/dist/openqasm 149 B
frontend/dist/openscad 1.43 kB
frontend/dist/oxygene 2.06 kB
frontend/dist/oz 143 B
frontend/dist/parigp 147 B
frontend/dist/parser 147 B
frontend/dist/parser3 689 B
frontend/dist/pascal 3 kB
frontend/dist/pascaligo 150 B
frontend/dist/passkeyLogic 1.13 kB
frontend/dist/PasswordReset 4.97 kB
frontend/dist/PasswordResetComplete 3.59 kB
frontend/dist/pcaxis 147 B
frontend/dist/peoplecode 151 B
frontend/dist/perl 8.26 kB
frontend/dist/PersonScene 16.4 kB
frontend/dist/PersonsScene 5.96 kB
frontend/dist/pf 1.41 kB
frontend/dist/pgsql 19 kB
frontend/dist/php 8.03 kB
frontend/dist/php-extras 219 B
frontend/dist/php-template 576 B
frontend/dist/phpdoc 249 B
frontend/dist/PipelineStatusScene 3.33 kB
frontend/dist/pla 1.69 kB
frontend/dist/plaintext 268 B
frontend/dist/plsql 180 B
frontend/dist/pony 1.11 kB
frontend/dist/posthog 252 kB
frontend/dist/postiats 7.86 kB
frontend/dist/powerquery 151 B
frontend/dist/powershell 3.28 kB
frontend/dist/PreflightCheck 6.2 kB
frontend/dist/processing 151 B
frontend/dist/product-tours.js 112 kB
frontend/dist/ProductTour 469 kB
frontend/dist/ProductTours 6.39 kB
frontend/dist/profile 632 B
frontend/dist/ProjectHomepage 6.46 kB
frontend/dist/prolog 147 B
frontend/dist/promql 147 B
frontend/dist/properties 859 B
frontend/dist/protobuf 824 B
frontend/dist/psl 144 B
frontend/dist/pug 144 B
frontend/dist/puppet 147 B
frontend/dist/pure 145 B
frontend/dist/purebasic 1.74 kB
frontend/dist/purescript 185 B
frontend/dist/python 4.75 kB
frontend/dist/python-repl 375 B
frontend/dist/q 1.28 kB
frontend/dist/qml 144 B
frontend/dist/qore 145 B
frontend/dist/qsharp 147 B
frontend/dist/r 3.24 kB
frontend/dist/racket 181 B
frontend/dist/razor 9.31 kB
frontend/dist/reason 147 B
frontend/dist/reasonml 3.41 kB
frontend/dist/recorder-v2.js 113 kB
frontend/dist/recorder.js 113 kB
frontend/dist/redis 3.56 kB
frontend/dist/redshift 11.8 kB
frontend/dist/refractor 17.8 kB
frontend/dist/regex 146 B
frontend/dist/RegionMap 135 kB
frontend/dist/rego 145 B
frontend/dist/render-query 17.7 MB
frontend/dist/render-query.js 17.7 MB
frontend/dist/renpy 146 B
frontend/dist/rest 145 B
frontend/dist/restructuredtext 3.91 kB
frontend/dist/RevenueAnalyticsScene 26.3 kB
frontend/dist/rib 1.44 kB
frontend/dist/rip 144 B
frontend/dist/roboconf 149 B
frontend/dist/robotframework 155 B
frontend/dist/routeros 2.66 kB
frontend/dist/rsl 1.2 kB
frontend/dist/ruby 8.51 kB
frontend/dist/ruleslanguage 3.98 kB
frontend/dist/rust 4.17 kB
frontend/dist/sas 144 B
frontend/dist/sass 145 B
frontend/dist/SavedInsights 1.31 kB
frontend/dist/sb 1.83 kB
frontend/dist/scala 1.68 kB
frontend/dist/scheme 147 B
frontend/dist/scilab 1.33 kB
frontend/dist/scss 145 B
frontend/dist/SdkDoctorScene 4.69 kB
frontend/dist/SessionAttributionExplorerScene 7.22 kB
frontend/dist/SessionGroupSummariesTable 5.28 kB
frontend/dist/SessionGroupSummaryScene 17.7 kB
frontend/dist/SessionProfileScene 16.6 kB
frontend/dist/SessionRecordingDetail 2.38 kB
frontend/dist/SessionRecordingFilePlaybackScene 5.12 kB
frontend/dist/SessionRecordings 1.42 kB
frontend/dist/SessionRecordingsKiosk 5.7 kB
frontend/dist/SessionRecordingsPlaylistScene 4.78 kB
frontend/dist/SessionRecordingsSettingsScene 2.59 kB
frontend/dist/SessionsScene 4.52 kB
frontend/dist/SettingsScene 3.56 kB
frontend/dist/SharedMetric 16 kB
frontend/dist/SharedMetrics 1.16 kB
frontend/dist/shell-session 188 B
frontend/dist/shell 3.08 kB
frontend/dist/SignalsDebug 3.31 kB
frontend/dist/SignupContainer 23.5 kB
frontend/dist/Site 1.82 kB
frontend/dist/smali 1.23 kB
frontend/dist/smalltalk 150 B
frontend/dist/smarty 181 B
frontend/dist/sml 1.27 kB
frontend/dist/solidity 149 B
frontend/dist/solution-file 154 B
frontend/dist/sophia 2.77 kB
frontend/dist/SourcesScene 3.8 kB
frontend/dist/sourceWizardLogic 1.34 kB
frontend/dist/soy 178 B
frontend/dist/sparql 181 B
frontend/dist/splunk-spl 151 B
frontend/dist/sqf 32.3 kB
frontend/dist/sql_more 12.4 kB
frontend/dist/sql 6.73 kB
frontend/dist/SqlVariableEditScene 7.9 kB
frontend/dist/squirrel 149 B
frontend/dist/st 7.41 kB
frontend/dist/stan 145 B
frontend/dist/StartupProgram 21.8 kB
frontend/dist/stata 16.8 kB
frontend/dist/step21 753 B
frontend/dist/stylus 147 B
frontend/dist/subunit 642 B
frontend/dist/SupportSettingsScene 20.7 kB
frontend/dist/SupportTicketScene 18.9 kB
frontend/dist/SupportTicketsScene 6.4 kB
frontend/dist/Survey 1.49 kB
frontend/dist/Surveys 13.4 kB
frontend/dist/surveys.js 90 kB
frontend/dist/SurveyTemplates 1.21 kB
frontend/dist/SurveyWizard 174 kB
frontend/dist/swift 7.62 kB
frontend/dist/systemd 148 B
frontend/dist/SystemStatus 17.6 kB
frontend/dist/systemverilog 7.62 kB
frontend/dist/t4-cs 214 B
frontend/dist/t4-templating 154 B
frontend/dist/t4-vb 248 B
frontend/dist/taggerscript 535 B
frontend/dist/tap 533 B
frontend/dist/TaskDetailScene 19.6 kB
frontend/dist/TaskTracker 17 kB
frontend/dist/tcl 3.57 kB
frontend/dist/textile 148 B
frontend/dist/thrift 744 B
frontend/dist/toml 145 B
frontend/dist/toolbar 6.75 MB
frontend/dist/toolbar.js 6.75 MB
frontend/dist/ToolbarLaunch 3.17 kB
frontend/dist/tp 1.6 kB
frontend/dist/tracing-headers.js 1.93 kB
frontend/dist/TransformationsScene 2.61 kB
frontend/dist/tremor 147 B
frontend/dist/tsMode 24 kB
frontend/dist/tsx 212 B
frontend/dist/tt2 178 B
frontend/dist/turtle 147 B
frontend/dist/twig 1.3 kB
frontend/dist/TwoFactorReset 4.64 kB
frontend/dist/typescript 151 B
frontend/dist/typespec 2.83 kB
frontend/dist/typoscript 151 B
frontend/dist/unrealscript 153 B
frontend/dist/Unsubscribe 2.27 kB
frontend/dist/uorazor 148 B
frontend/dist/uri 144 B
frontend/dist/UserInterview 5.17 kB
frontend/dist/UserInterviews 2.67 kB
frontend/dist/v 142 B
frontend/dist/vala 145 B
frontend/dist/vb 5.8 kB
frontend/dist/vbnet 180 B
frontend/dist/vbscript 1.83 kB
frontend/dist/vbscript-html 308 B
frontend/dist/velocity 149 B
frontend/dist/VercelLinkError 2.56 kB
frontend/dist/VerifyEmail 5.13 kB
frontend/dist/verilog 148 B
frontend/dist/vhdl 1.81 kB
frontend/dist/vim 144 B
frontend/dist/visual-basic 153 B
frontend/dist/warpscript 151 B
frontend/dist/wasm 145 B
frontend/dist/web-idl 148 B
frontend/dist/web-vitals.js 6.6 kB
frontend/dist/WebAnalyticsScene 6.7 kB
frontend/dist/wgsl 7.35 kB
frontend/dist/wiki 145 B
frontend/dist/Wizard 5.11 kB
frontend/dist/wolfram 148 B
frontend/dist/WorkflowScene 81.3 kB
frontend/dist/WorkflowsScene 46.4 kB
frontend/dist/WorldMap 1.04 MB
frontend/dist/wren 145 B
frontend/dist/x86asm 19.2 kB
frontend/dist/xeora 146 B
frontend/dist/xl 1.77 kB
frontend/dist/xml-doc 148 B
frontend/dist/xml 2.14 kB
frontend/dist/xojo 145 B
frontend/dist/xquery 147 B
frontend/dist/yaml 145 B
frontend/dist/yang 145 B
frontend/dist/zephir 1.71 kB
frontend/dist/zig 144 B

compressed-size-action

@ioannisj
Copy link
Contributor Author

@ablaszkiewicz Hey can I have a quick sanity check before I push tag posthog-cli-v0.5.30. This PR was a bit old and just merged master.

Copy link
Contributor

@ablaszkiewicz ablaszkiewicz left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@ioannisj ioannisj merged commit 09f0ab1 into master Feb 16, 2026
135 checks passed
@ioannisj ioannisj deleted the feat/cli-upload-dsym branch February 16, 2026 09:23
Comment on lines +19 to +22
/// The bundle identifier (e.g., com.example.app).
/// If not provided, will be extracted from dSYM Info.plist.
#[arg(long)]
pub project: Option<String>,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ioannisj @hpouillot this was renamed in some other places (@hpouillot can share more), since we've not released this, we should fix it as well to avoid confusion

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah I think this was renamed to name internally (and maps to that)

Wanted to get the bulk of this out so that I can continue work with symbolication

CleanShot 2026-02-16 at 13 34 17

Some open discussions around this in PostHog/posthog-ios#412, so will follow up with a another PR here once we decide on the direction there.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CleanShot 2026-02-16 at 13 41 19

For iOS, this is just the bundle identifier (and seems to be mapping correctly). Maybe we can consider renaming the param to bundle-id even?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this has nothing to do with the bundle id, we just use the bundle id and version as identifiers for the release (since theres nothing better than that)
so i think release_name and release_version should be the ones we should use
#47510

Copy link
Contributor Author

@ioannisj ioannisj Feb 16, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These are the CLI args through for dsym upload command (and we map with appropriate fields in ReleaseBuilder). For dSYM uploads specifically, --bundle-id feels more descriptive to me since it's apple only?

Agreed that --project should go though

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

my point is that release-name is a cli param, that can be overriden by the calleer to whatever they want, and we use the bundle id as a fallback, so calling it bundle-id does not make sense because it can be anything like 'uber driver' | 'uber passenger'

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah got you, fair point actually, even though will most likely be used exclusively in xcode script. In this case release_name and release_version may be better fit

Comment on lines +34 to +38
/// The main dSYM file name (e.g., MyApp.app.dSYM).
/// Used to extract version info from the correct dSYM when multiple are present.
/// This is typically $DWARF_DSYM_FILE_NAME in Xcode build phases.
#[arg(long)]
pub main_dsym: Option<String>,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

shouldnt we parse this info from plist.info instead?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok now i see that we do this + Contents/Info.plist


# 0.5.30

- Add experimental dSYM upload for iOS/macOS crash symbolication
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- Add experimental dSYM upload for iOS/macOS crash symbolication
- Add experimental dSYM upload for iOS/macOS stack trace symbolication

abhischekt pushed a commit that referenced this pull request Feb 16, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

Comments