@@ -13,6 +13,8 @@ import { ConfigFile, Logger, Org, SfdxError, Messages } from '@salesforce/core';
13
13
import { Dictionary , Optional } from '@salesforce/ts-types' ;
14
14
import { Duration , env , toNumber } from '@salesforce/kit' ;
15
15
import { retryDecorator } from 'ts-retry-promise' ;
16
+ import { RemoteSyncInput } from '../shared/types' ;
17
+ import { getMetadataKeyFromFileResponse } from './metadataKeys' ;
16
18
17
19
export type MemberRevision = {
18
20
serverRevisionCounter : number ;
@@ -53,6 +55,7 @@ export namespace RemoteSourceTrackingService {
53
55
export const getMetadataKey = ( metadataType : string , metadataName : string ) : string => {
54
56
return `${ metadataType } __${ metadataName } ` ;
55
57
} ;
58
+
56
59
/**
57
60
* This service handles source tracking of metadata between a local project and an org.
58
61
* Source tracking state is persisted to .sfdx/orgs/<orgId>/maxRevision.json.
@@ -178,19 +181,21 @@ export class RemoteSourceTrackingService extends ConfigFile<RemoteSourceTracking
178
181
* pass in a set of metadata keys (type__name like 'ApexClass__MyClass').\
179
182
* it sets their last retrieved revision to the current revision counter from the server.
180
183
*/
181
- public async syncNamedElementsByKey ( metadataKeys : string [ ] ) : Promise < void > {
182
- if ( metadataKeys . length === 0 ) {
184
+ public async syncSpecifiedElements ( elements : RemoteSyncInput [ ] ) : Promise < void > {
185
+ if ( elements . length === 0 ) {
183
186
return ;
184
187
}
185
- const quiet = metadataKeys . length > 100 ;
188
+ const quiet = elements . length > 100 ;
186
189
if ( quiet ) {
187
- this . logger . debug ( `Syncing ${ metadataKeys . length } Revisions by key` ) ;
190
+ this . logger . debug ( `Syncing ${ elements . length } Revisions by key` ) ;
188
191
}
189
192
190
- // makes sure we have updated SourceMember data for the org; uses cache
191
- await this . retrieveUpdates ( ) ;
192
193
const revisions = this . getSourceMembers ( ) ;
193
- metadataKeys . map ( ( metadataKey ) => {
194
+
195
+ // this can be super-repetitive on a large ExperienceBundle where there is an element for each file but only one Revision for the entire bundle
196
+ // any item in an aura/LWC bundle needs to represent the top (bundle) level and the file itself
197
+ // so we de-dupe via a set
198
+ [ ...new Set ( elements . map ( ( element ) => getMetadataKeyFromFileResponse ( element ) ) . flat ( ) ) ] . map ( ( metadataKey ) => {
194
199
const revision = revisions [ metadataKey ] ;
195
200
if ( revision && revision . lastRetrievedFromServer !== revision . serverRevisionCounter ) {
196
201
if ( ! quiet ) {
@@ -201,11 +206,13 @@ export class RemoteSourceTrackingService extends ConfigFile<RemoteSourceTracking
201
206
revision . lastRetrievedFromServer = revision . serverRevisionCounter ;
202
207
this . setMemberRevision ( metadataKey , revision ) ;
203
208
} else {
204
- this . logger . warn ( `could not find remote tracking entry for ${ metadataKey } ` ) ;
209
+ this . logger . warn ( `found no matching revision for ${ metadataKey } ` ) ;
205
210
}
206
211
} ) ;
212
+
207
213
await this . write ( ) ;
208
214
}
215
+
209
216
/**
210
217
* Returns the `ChangeElement` currently being tracked given a metadata key,
211
218
* or `undefined` if not found.
@@ -381,9 +388,9 @@ export class RemoteSourceTrackingService extends ConfigFile<RemoteSourceTracking
381
388
// to sync the retrieved SourceMembers; meaning it will update the lastRetrievedFromServer
382
389
// field to the SourceMember's RevisionCounter, and update the serverMaxRevisionCounter
383
390
// to the highest RevisionCounter.
384
- public async retrieveUpdates ( sync = false ) : Promise < RemoteChangeElement [ ] > {
391
+ public async retrieveUpdates ( { sync = false , cache = true } = { } ) : Promise < RemoteChangeElement [ ] > {
385
392
// Always track new SourceMember data, or update tracking when we sync.
386
- const queriedSourceMembers = await this . querySourceMembersFrom ( ) ;
393
+ const queriedSourceMembers = await this . querySourceMembersFrom ( { useCache : cache } ) ;
387
394
if ( queriedSourceMembers . length || sync ) {
388
395
await this . trackSourceMembers ( queriedSourceMembers , sync ) ;
389
396
}
0 commit comments