@@ -143,8 +143,27 @@ function getAffectedTestApplications(
143
143
. map ( line => line . trim ( ) )
144
144
. filter ( Boolean ) ;
145
145
146
- // If something in e2e tests themselves are changed, just run everything
146
+ // If something in e2e tests themselves are changed, check if only test applications were changed
147
147
if ( affectedProjects . includes ( '@sentry-internal/e2e-tests' ) ) {
148
+ try {
149
+ const changedTestApps = getChangedTestApps ( base , head ) ;
150
+
151
+ // Shared code was changed, run all tests
152
+ if ( changedTestApps === false ) {
153
+ return testApplications ;
154
+ }
155
+
156
+ // Only test applications that were changed, run selectively
157
+ if ( changedTestApps . size > 0 ) {
158
+ return testApplications . filter ( testApp => changedTestApps . has ( testApp ) ) ;
159
+ }
160
+ } catch ( error ) {
161
+ // eslint-disable-next-line no-console
162
+ console . error ( 'Failed to get changed files, running all tests:' , error ) ;
163
+ return testApplications ;
164
+ }
165
+
166
+ // Fall back to running all tests
148
167
return testApplications ;
149
168
}
150
169
@@ -153,3 +172,32 @@ function getAffectedTestApplications(
153
172
return sentryDependencies . some ( dep => affectedProjects . includes ( dep ) ) ;
154
173
} ) ;
155
174
}
175
+
176
+ function getChangedTestApps ( base : string , head ?: string ) : false | Set < string > {
177
+ const changedFiles = execSync ( `git diff --name-only ${ base } ${ head ? `..${ head } ` : '' } -- dev-packages/e2e-tests/` , {
178
+ encoding : 'utf-8' ,
179
+ } )
180
+ . toString ( )
181
+ . split ( '\n' )
182
+ . map ( line => line . trim ( ) )
183
+ . filter ( Boolean ) ;
184
+
185
+ const changedTestApps : Set < string > = new Set ( ) ;
186
+ const testAppsPrefix = 'dev-packages/e2e-tests/test-applications/' ;
187
+
188
+ for ( const file of changedFiles ) {
189
+ if ( ! file . startsWith ( testAppsPrefix ) ) {
190
+ // Shared code change - need to run all tests
191
+ return false ;
192
+ }
193
+
194
+ const pathAfterPrefix = file . slice ( testAppsPrefix . length ) ;
195
+ const slashIndex = pathAfterPrefix . indexOf ( '/' ) ;
196
+
197
+ if ( slashIndex > 0 ) {
198
+ changedTestApps . add ( pathAfterPrefix . slice ( 0 , slashIndex ) ) ;
199
+ }
200
+ }
201
+
202
+ return changedTestApps ;
203
+ }
0 commit comments