@anvil-works/anvil-cli 0.7.0-canary.12 → 0.7.0-canary.14

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.
@@ -136,6 +136,7 @@ export declare class WatchSession extends Emitter<WatchSessionEvents> {
136
136
  resumeAfterUserInput(): void;
137
137
  initialize(): Promise<void>;
138
138
  private initializeProcessors;
139
+ private syncAfterSave;
139
140
  private connectWebSocket;
140
141
  private handleDependencyRepoUpdate;
141
142
  private queueDependencyRefresh;
@@ -1 +1 @@
1
- {"version":3,"file":"WatchSession.d.ts","sourceRoot":"","sources":["../src/WatchSession.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"WatchSession.d.ts","sourceRoot":"","sources":["../src/WatchSession.ts"],"names":[],"mappings":"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"}
package/dist/cli.js CHANGED
@@ -14899,6 +14899,32 @@ Promise.resolve(executeGitCredentialOperation(process.argv[2] || "get", {
14899
14899
  throw errors_createGitError.commandFailed("rebase --abort", e.message);
14900
14900
  }
14901
14901
  }
14902
+ async isAncestor(ancestorRef, descendantRef) {
14903
+ try {
14904
+ const mergeBase = (await this.git.raw([
14905
+ "merge-base",
14906
+ ancestorRef,
14907
+ descendantRef
14908
+ ])).trim();
14909
+ const ancestorCommit = (await this.git.revparse([
14910
+ ancestorRef
14911
+ ])).trim();
14912
+ return mergeBase === ancestorCommit;
14913
+ } catch {
14914
+ return false;
14915
+ }
14916
+ }
14917
+ async mergeFastForward(ref) {
14918
+ try {
14919
+ await this.git.raw([
14920
+ "merge",
14921
+ "--ff-only",
14922
+ ref
14923
+ ]);
14924
+ } catch (e) {
14925
+ throw errors_createGitError.commandFailed("merge --ff-only", e.message);
14926
+ }
14927
+ }
14902
14928
  async deleteRef(ref) {
14903
14929
  try {
14904
14930
  await this.git.raw([
@@ -17578,6 +17604,7 @@ Promise.resolve(executeGitCredentialOperation(process.argv[2] || "get", {
17578
17604
  class SaveProcessor extends Emitter {
17579
17605
  hasPendingChanges = false;
17580
17606
  debounceTimer = null;
17607
+ saveLoopPromise = null;
17581
17608
  saveSequence = 0;
17582
17609
  SAVE_DEBOUNCE_MS = 1000;
17583
17610
  MAX_RETRIES = 3;
@@ -17601,6 +17628,7 @@ Promise.resolve(executeGitCredentialOperation(process.argv[2] || "get", {
17601
17628
  if (this.debounceTimer) clearTimeout(this.debounceTimer);
17602
17629
  if (isFirstChange) logger_logger.progress("sync", "Change detected");
17603
17630
  this.debounceTimer = setTimeout(()=>{
17631
+ this.debounceTimer = null;
17604
17632
  this.processSaveBatchWithEvents().catch((error)=>{
17605
17633
  logger_logger.error(`Save failed: ${errors_getErrorMessage(error)}`);
17606
17634
  });
@@ -17625,6 +17653,18 @@ Promise.resolve(executeGitCredentialOperation(process.argv[2] || "get", {
17625
17653
  }
17626
17654
  }
17627
17655
  async processSaveBatchWithEvents() {
17656
+ if (this.saveLoopPromise) return this.saveLoopPromise;
17657
+ this.saveLoopPromise = this.drainSaveQueue();
17658
+ try {
17659
+ await this.saveLoopPromise;
17660
+ } finally{
17661
+ this.saveLoopPromise = null;
17662
+ }
17663
+ }
17664
+ async drainSaveQueue() {
17665
+ while(this.hasPendingChanges && !this.config.isCleanedUp() && !this.config.isPaused())await this.processOneSaveBatchWithEvents();
17666
+ }
17667
+ async processOneSaveBatchWithEvents() {
17628
17668
  if (this.config.isCleanedUp()) return;
17629
17669
  logger_logger.progressUpdate("sync", "Processing");
17630
17670
  if (!this.hasPendingChanges) return void logger_logger.progressEnd("sync");
@@ -17968,7 +18008,7 @@ Promise.resolve(executeGitCredentialOperation(process.argv[2] || "get", {
17968
18008
  await this.handleConflict(json_resp, originalFilePaths, retryCount);
17969
18009
  return;
17970
18010
  }
17971
- if (200 === resp.status) return void await this.handleSuccess(json_resp);
18011
+ if (200 === resp.status) return void await this.handleSuccess(json_resp, originalFilePaths);
17972
18012
  logger_logger.error(`Unexpected response status: ${resp.status}`);
17973
18013
  throw {
17974
18014
  type: "server_error",
@@ -18071,10 +18111,10 @@ Promise.resolve(executeGitCredentialOperation(process.argv[2] || "get", {
18071
18111
  reason: "Unknown conflict"
18072
18112
  };
18073
18113
  }
18074
- async handleSuccess(json_resp) {
18114
+ async handleSuccess(json_resp, originalFilePaths) {
18075
18115
  const version = json_resp.version;
18076
18116
  const oldCommitId = json_resp.previous_commit ?? null;
18077
- this.config.setCommitId(version);
18117
+ const commitIdBeforePostSaveSync = this.config.getCommitId();
18078
18118
  this.emit("saved", {
18079
18119
  oldCommitId,
18080
18120
  newCommitId: version,
@@ -18082,8 +18122,9 @@ Promise.resolve(executeGitCredentialOperation(process.argv[2] || "get", {
18082
18122
  });
18083
18123
  if (this.postSaveCallback) {
18084
18124
  logger_logger.progressUpdate("sync", "Syncing back");
18085
- await this.postSaveCallback();
18125
+ await this.postSaveCallback(new Set(originalFilePaths));
18086
18126
  }
18127
+ if (this.config.getCommitId() === commitIdBeforePostSaveSync) this.config.setCommitId(version);
18087
18128
  }
18088
18129
  async rerouteChanges(changes) {
18089
18130
  logger_logger.verbose(external_chalk_default().blue(`Re-routing ${changes.length} local change(s)...`));
@@ -18137,62 +18178,94 @@ Promise.resolve(executeGitCredentialOperation(process.argv[2] || "get", {
18137
18178
  }
18138
18179
  class SyncManager extends Emitter {
18139
18180
  config;
18140
- syncInProgress = false;
18181
+ syncQueue = Promise.resolve();
18141
18182
  constructor(config){
18142
18183
  super();
18143
18184
  this.config = config;
18144
18185
  }
18145
18186
  async syncRemoteChanges(knownLocalChanges) {
18146
- if (this.syncInProgress) {
18147
- logger_logger.debug("Sync already in progress, skipping");
18187
+ const runSync = ()=>this.performSyncRemoteChanges(knownLocalChanges);
18188
+ const queuedSync = this.syncQueue.then(runSync, runSync);
18189
+ this.syncQueue = queuedSync.catch(()=>{});
18190
+ return queuedSync;
18191
+ }
18192
+ async performSyncRemoteChanges(knownLocalChanges) {
18193
+ const oldCommitId = this.config.getCommitId();
18194
+ let locallyChangedFiles;
18195
+ let initialStatus;
18196
+ if (knownLocalChanges) locallyChangedFiles = knownLocalChanges;
18197
+ else {
18198
+ initialStatus = await this.config.gitService.getStatus();
18199
+ locallyChangedFiles = buildLocalChangesSet(initialStatus);
18200
+ }
18201
+ let syncMode;
18202
+ if (!knownLocalChanges && initialStatus && this.isCleanForFastForward(initialStatus)) syncMode = await this.fetchAndMoveCleanTreeToAnvilHead(oldCommitId, locallyChangedFiles);
18203
+ else {
18204
+ await this.fetchAndResetFromAnvil(locallyChangedFiles);
18205
+ syncMode = "preservation";
18206
+ }
18207
+ if ("clean-move" === syncMode) return {
18208
+ localOnlyChanges: [],
18209
+ conflicts: []
18210
+ };
18211
+ const newCommitId = await this.config.gitService.getCommitId();
18212
+ this.config.setCommitId(newCommitId);
18213
+ const remoteChangedFiles = await detectRemoteChanges(this.config.gitService, oldCommitId, newCommitId);
18214
+ const statusAfter = await this.config.gitService.getStatus();
18215
+ const newChanges = extractChangesFromStatus(statusAfter);
18216
+ if (0 === newChanges.length) {
18217
+ logger_logger.verbose(external_chalk_default().gray(" No local changes - working directory is clean"));
18148
18218
  return {
18149
18219
  localOnlyChanges: [],
18150
18220
  conflicts: []
18151
18221
  };
18152
18222
  }
18153
- this.syncInProgress = true;
18154
- try {
18155
- const oldCommitId = this.config.getCommitId();
18156
- let locallyChangedFiles;
18157
- if (knownLocalChanges) locallyChangedFiles = knownLocalChanges;
18223
+ const result = categorizeChanges(newChanges, locallyChangedFiles, remoteChangedFiles);
18224
+ await acceptRemoteChanges(this.config.gitService, result.remoteOnlyChanges);
18225
+ logConflictResolution(result);
18226
+ return {
18227
+ localOnlyChanges: result.localOnlyChanges,
18228
+ conflicts: result.conflicts
18229
+ };
18230
+ }
18231
+ async fetchAndResetFromAnvil(localChangesToPreserve = new Set()) {
18232
+ const oldCommitId = this.config.getCommitId();
18233
+ await this.withFetchedAnvilRef((tempRef)=>this.resetToFetchedAnvilRef(tempRef, oldCommitId, localChangesToPreserve));
18234
+ }
18235
+ async fetchAndMoveCleanTreeToAnvilHead(oldCommitId, locallyChangedFiles) {
18236
+ return this.withFetchedAnvilRef(async (tempRef)=>{
18237
+ const localHead = await this.config.gitService.getCommitId();
18238
+ if (await this.config.gitService.isAncestor(localHead, tempRef)) await this.config.gitService.mergeFastForward(tempRef);
18158
18239
  else {
18159
- const status = await this.config.gitService.getStatus();
18160
- locallyChangedFiles = buildLocalChangesSet(status);
18240
+ const statusBeforeHardReset = await this.config.gitService.getStatus();
18241
+ if (!this.isCleanForFastForward(statusBeforeHardReset)) {
18242
+ for (const filePath of buildLocalChangesSet(statusBeforeHardReset))locallyChangedFiles.add(filePath);
18243
+ await this.resetToFetchedAnvilRef(tempRef, oldCommitId, locallyChangedFiles);
18244
+ return "preservation";
18245
+ }
18246
+ await this.config.gitService.reset(tempRef, "hard");
18161
18247
  }
18162
- await this.fetchAndResetFromAnvil(locallyChangedFiles);
18163
18248
  const newCommitId = await this.config.gitService.getCommitId();
18164
18249
  this.config.setCommitId(newCommitId);
18165
- const remoteChangedFiles = await detectRemoteChanges(this.config.gitService, oldCommitId, newCommitId);
18166
- const statusAfter = await this.config.gitService.getStatus();
18167
- const newChanges = extractChangesFromStatus(statusAfter);
18168
- if (0 === newChanges.length) {
18169
- logger_logger.verbose(external_chalk_default().gray(" No local changes - working directory is clean"));
18170
- return {
18171
- localOnlyChanges: [],
18172
- conflicts: []
18173
- };
18174
- }
18175
- const result = categorizeChanges(newChanges, locallyChangedFiles, remoteChangedFiles);
18176
- await acceptRemoteChanges(this.config.gitService, result.remoteOnlyChanges);
18177
- logConflictResolution(result);
18178
- return {
18179
- localOnlyChanges: result.localOnlyChanges,
18180
- conflicts: result.conflicts
18181
- };
18182
- } finally{
18183
- this.syncInProgress = false;
18184
- }
18250
+ await this.config.editorYaml.reload();
18251
+ return "clean-move";
18252
+ });
18185
18253
  }
18186
- async fetchAndResetFromAnvil(localChangesToPreserve = new Set()) {
18254
+ async withFetchedAnvilRef(callback) {
18187
18255
  const validToken = await auth_getValidAuthToken(this.config.anvilUrl, this.config.username);
18188
18256
  this.config.setAuthToken(validToken);
18189
18257
  const httpUrl = getGitFetchUrl(this.config.appId, this.config.getAuthToken(), this.config.anvilUrl);
18190
18258
  const currentBranch = this.config.getCurrentBranch();
18191
18259
  const tempRef = `anvil-sync-temp-${Date.now()}`;
18192
- const oldCommitId = this.config.getCommitId();
18193
- await this.config.gitService.fetch(httpUrl, `+${currentBranch}:${tempRef}`);
18260
+ try {
18261
+ await this.config.gitService.fetch(httpUrl, `+${currentBranch}:${tempRef}`);
18262
+ return await callback(tempRef);
18263
+ } finally{
18264
+ await this.config.gitService.deleteRef(`refs/heads/${tempRef}`);
18265
+ }
18266
+ }
18267
+ async resetToFetchedAnvilRef(tempRef, oldCommitId, localChangesToPreserve) {
18194
18268
  await this.config.gitService.reset(tempRef, "mixed");
18195
- await this.config.gitService.deleteRef(`refs/heads/${tempRef}`);
18196
18269
  const newCommitId = await this.config.gitService.getCommitId();
18197
18270
  await this.config.gitService.checkout([
18198
18271
  ".anvil_editor.yaml",
@@ -18202,6 +18275,9 @@ Promise.resolve(executeGitCredentialOperation(process.argv[2] || "get", {
18202
18275
  await this.deleteFilesRemovedOnAnvilLocally(oldCommitId, newCommitId, localChangesToPreserve);
18203
18276
  await this.discardFormattingOnlyYamlChanges();
18204
18277
  }
18278
+ isCleanForFastForward(status) {
18279
+ return status.isClean && 0 === status.modified.length && 0 === status.notAdded.length && 0 === status.created.length && 0 === status.deleted.length && 0 === status.staged.length && 0 === status.renamed.length;
18280
+ }
18205
18281
  async deleteFilesRemovedOnAnvilLocally(oldCommitId, newCommitId, localChangesToPreserve) {
18206
18282
  try {
18207
18283
  const status = await this.config.gitService.getStatus();
@@ -18415,7 +18491,7 @@ Promise.resolve(executeGitCredentialOperation(process.argv[2] || "get", {
18415
18491
  isPaused: ()=>this.isPausedForUserInput
18416
18492
  });
18417
18493
  this.saveProcessor.setSyncCallback((filePaths)=>this.syncManager.syncRemoteChanges(filePaths));
18418
- this.saveProcessor.setPostSaveCallback(()=>this.syncManager.fetchAndResetFromAnvil());
18494
+ this.saveProcessor.setPostSaveCallback((filePaths)=>this.syncAfterSave(filePaths));
18419
18495
  this.saveProcessor.on("save-started", (data)=>this.emit("save-started", data));
18420
18496
  this.saveProcessor.on("save-succeeded", (data)=>this.emit("save-succeeded", data));
18421
18497
  this.saveProcessor.on("save-failed", (data)=>this.emit("save-failed", data));
@@ -18428,6 +18504,12 @@ Promise.resolve(executeGitCredentialOperation(process.argv[2] || "get", {
18428
18504
  this.saveProcessor.on("sync-conflict", (data)=>this.emit("sync-conflict", data));
18429
18505
  this.saveProcessor.on("max-retries-exceeded", (data)=>this.emit("max-retries-exceeded", data));
18430
18506
  }
18507
+ async syncAfterSave(savedFilePaths) {
18508
+ const status = await this.gitService.getStatus();
18509
+ const locallyChangedFiles = buildLocalChangesSet(status);
18510
+ if (!this.stagedOnly) for (const filePath of savedFilePaths)locallyChangedFiles.add(filePath);
18511
+ return this.syncManager.syncRemoteChanges(locallyChangedFiles);
18512
+ }
18431
18513
  async connectWebSocket() {
18432
18514
  this.wsClient = new WebSocketClient({
18433
18515
  appId: this.appId,
package/dist/index.js CHANGED
@@ -14927,6 +14927,32 @@ Promise.resolve(executeGitCredentialOperation(process.argv[2] || "get", {
14927
14927
  throw errors_createGitError.commandFailed("rebase --abort", e.message);
14928
14928
  }
14929
14929
  }
14930
+ async isAncestor(ancestorRef, descendantRef) {
14931
+ try {
14932
+ const mergeBase = (await this.git.raw([
14933
+ "merge-base",
14934
+ ancestorRef,
14935
+ descendantRef
14936
+ ])).trim();
14937
+ const ancestorCommit = (await this.git.revparse([
14938
+ ancestorRef
14939
+ ])).trim();
14940
+ return mergeBase === ancestorCommit;
14941
+ } catch {
14942
+ return false;
14943
+ }
14944
+ }
14945
+ async mergeFastForward(ref) {
14946
+ try {
14947
+ await this.git.raw([
14948
+ "merge",
14949
+ "--ff-only",
14950
+ ref
14951
+ ]);
14952
+ } catch (e) {
14953
+ throw errors_createGitError.commandFailed("merge --ff-only", e.message);
14954
+ }
14955
+ }
14930
14956
  async deleteRef(ref) {
14931
14957
  try {
14932
14958
  await this.git.raw([
@@ -17606,6 +17632,7 @@ Promise.resolve(executeGitCredentialOperation(process.argv[2] || "get", {
17606
17632
  class SaveProcessor extends Emitter {
17607
17633
  hasPendingChanges = false;
17608
17634
  debounceTimer = null;
17635
+ saveLoopPromise = null;
17609
17636
  saveSequence = 0;
17610
17637
  SAVE_DEBOUNCE_MS = 1000;
17611
17638
  MAX_RETRIES = 3;
@@ -17629,6 +17656,7 @@ Promise.resolve(executeGitCredentialOperation(process.argv[2] || "get", {
17629
17656
  if (this.debounceTimer) clearTimeout(this.debounceTimer);
17630
17657
  if (isFirstChange) logger_logger.progress("sync", "Change detected");
17631
17658
  this.debounceTimer = setTimeout(()=>{
17659
+ this.debounceTimer = null;
17632
17660
  this.processSaveBatchWithEvents().catch((error)=>{
17633
17661
  logger_logger.error(`Save failed: ${errors_getErrorMessage(error)}`);
17634
17662
  });
@@ -17653,6 +17681,18 @@ Promise.resolve(executeGitCredentialOperation(process.argv[2] || "get", {
17653
17681
  }
17654
17682
  }
17655
17683
  async processSaveBatchWithEvents() {
17684
+ if (this.saveLoopPromise) return this.saveLoopPromise;
17685
+ this.saveLoopPromise = this.drainSaveQueue();
17686
+ try {
17687
+ await this.saveLoopPromise;
17688
+ } finally{
17689
+ this.saveLoopPromise = null;
17690
+ }
17691
+ }
17692
+ async drainSaveQueue() {
17693
+ while(this.hasPendingChanges && !this.config.isCleanedUp() && !this.config.isPaused())await this.processOneSaveBatchWithEvents();
17694
+ }
17695
+ async processOneSaveBatchWithEvents() {
17656
17696
  if (this.config.isCleanedUp()) return;
17657
17697
  logger_logger.progressUpdate("sync", "Processing");
17658
17698
  if (!this.hasPendingChanges) return void logger_logger.progressEnd("sync");
@@ -17996,7 +18036,7 @@ Promise.resolve(executeGitCredentialOperation(process.argv[2] || "get", {
17996
18036
  await this.handleConflict(json_resp, originalFilePaths, retryCount);
17997
18037
  return;
17998
18038
  }
17999
- if (200 === resp.status) return void await this.handleSuccess(json_resp);
18039
+ if (200 === resp.status) return void await this.handleSuccess(json_resp, originalFilePaths);
18000
18040
  logger_logger.error(`Unexpected response status: ${resp.status}`);
18001
18041
  throw {
18002
18042
  type: "server_error",
@@ -18099,10 +18139,10 @@ Promise.resolve(executeGitCredentialOperation(process.argv[2] || "get", {
18099
18139
  reason: "Unknown conflict"
18100
18140
  };
18101
18141
  }
18102
- async handleSuccess(json_resp) {
18142
+ async handleSuccess(json_resp, originalFilePaths) {
18103
18143
  const version = json_resp.version;
18104
18144
  const oldCommitId = json_resp.previous_commit ?? null;
18105
- this.config.setCommitId(version);
18145
+ const commitIdBeforePostSaveSync = this.config.getCommitId();
18106
18146
  this.emit("saved", {
18107
18147
  oldCommitId,
18108
18148
  newCommitId: version,
@@ -18110,8 +18150,9 @@ Promise.resolve(executeGitCredentialOperation(process.argv[2] || "get", {
18110
18150
  });
18111
18151
  if (this.postSaveCallback) {
18112
18152
  logger_logger.progressUpdate("sync", "Syncing back");
18113
- await this.postSaveCallback();
18153
+ await this.postSaveCallback(new Set(originalFilePaths));
18114
18154
  }
18155
+ if (this.config.getCommitId() === commitIdBeforePostSaveSync) this.config.setCommitId(version);
18115
18156
  }
18116
18157
  async rerouteChanges(changes) {
18117
18158
  logger_logger.verbose(external_chalk_default().blue(`Re-routing ${changes.length} local change(s)...`));
@@ -18165,62 +18206,94 @@ Promise.resolve(executeGitCredentialOperation(process.argv[2] || "get", {
18165
18206
  }
18166
18207
  class SyncManager extends Emitter {
18167
18208
  config;
18168
- syncInProgress = false;
18209
+ syncQueue = Promise.resolve();
18169
18210
  constructor(config){
18170
18211
  super();
18171
18212
  this.config = config;
18172
18213
  }
18173
18214
  async syncRemoteChanges(knownLocalChanges) {
18174
- if (this.syncInProgress) {
18175
- logger_logger.debug("Sync already in progress, skipping");
18215
+ const runSync = ()=>this.performSyncRemoteChanges(knownLocalChanges);
18216
+ const queuedSync = this.syncQueue.then(runSync, runSync);
18217
+ this.syncQueue = queuedSync.catch(()=>{});
18218
+ return queuedSync;
18219
+ }
18220
+ async performSyncRemoteChanges(knownLocalChanges) {
18221
+ const oldCommitId = this.config.getCommitId();
18222
+ let locallyChangedFiles;
18223
+ let initialStatus;
18224
+ if (knownLocalChanges) locallyChangedFiles = knownLocalChanges;
18225
+ else {
18226
+ initialStatus = await this.config.gitService.getStatus();
18227
+ locallyChangedFiles = buildLocalChangesSet(initialStatus);
18228
+ }
18229
+ let syncMode;
18230
+ if (!knownLocalChanges && initialStatus && this.isCleanForFastForward(initialStatus)) syncMode = await this.fetchAndMoveCleanTreeToAnvilHead(oldCommitId, locallyChangedFiles);
18231
+ else {
18232
+ await this.fetchAndResetFromAnvil(locallyChangedFiles);
18233
+ syncMode = "preservation";
18234
+ }
18235
+ if ("clean-move" === syncMode) return {
18236
+ localOnlyChanges: [],
18237
+ conflicts: []
18238
+ };
18239
+ const newCommitId = await this.config.gitService.getCommitId();
18240
+ this.config.setCommitId(newCommitId);
18241
+ const remoteChangedFiles = await detectRemoteChanges(this.config.gitService, oldCommitId, newCommitId);
18242
+ const statusAfter = await this.config.gitService.getStatus();
18243
+ const newChanges = extractChangesFromStatus(statusAfter);
18244
+ if (0 === newChanges.length) {
18245
+ logger_logger.verbose(external_chalk_default().gray(" No local changes - working directory is clean"));
18176
18246
  return {
18177
18247
  localOnlyChanges: [],
18178
18248
  conflicts: []
18179
18249
  };
18180
18250
  }
18181
- this.syncInProgress = true;
18182
- try {
18183
- const oldCommitId = this.config.getCommitId();
18184
- let locallyChangedFiles;
18185
- if (knownLocalChanges) locallyChangedFiles = knownLocalChanges;
18251
+ const result = categorizeChanges(newChanges, locallyChangedFiles, remoteChangedFiles);
18252
+ await acceptRemoteChanges(this.config.gitService, result.remoteOnlyChanges);
18253
+ logConflictResolution(result);
18254
+ return {
18255
+ localOnlyChanges: result.localOnlyChanges,
18256
+ conflicts: result.conflicts
18257
+ };
18258
+ }
18259
+ async fetchAndResetFromAnvil(localChangesToPreserve = new Set()) {
18260
+ const oldCommitId = this.config.getCommitId();
18261
+ await this.withFetchedAnvilRef((tempRef)=>this.resetToFetchedAnvilRef(tempRef, oldCommitId, localChangesToPreserve));
18262
+ }
18263
+ async fetchAndMoveCleanTreeToAnvilHead(oldCommitId, locallyChangedFiles) {
18264
+ return this.withFetchedAnvilRef(async (tempRef)=>{
18265
+ const localHead = await this.config.gitService.getCommitId();
18266
+ if (await this.config.gitService.isAncestor(localHead, tempRef)) await this.config.gitService.mergeFastForward(tempRef);
18186
18267
  else {
18187
- const status = await this.config.gitService.getStatus();
18188
- locallyChangedFiles = buildLocalChangesSet(status);
18268
+ const statusBeforeHardReset = await this.config.gitService.getStatus();
18269
+ if (!this.isCleanForFastForward(statusBeforeHardReset)) {
18270
+ for (const filePath of buildLocalChangesSet(statusBeforeHardReset))locallyChangedFiles.add(filePath);
18271
+ await this.resetToFetchedAnvilRef(tempRef, oldCommitId, locallyChangedFiles);
18272
+ return "preservation";
18273
+ }
18274
+ await this.config.gitService.reset(tempRef, "hard");
18189
18275
  }
18190
- await this.fetchAndResetFromAnvil(locallyChangedFiles);
18191
18276
  const newCommitId = await this.config.gitService.getCommitId();
18192
18277
  this.config.setCommitId(newCommitId);
18193
- const remoteChangedFiles = await detectRemoteChanges(this.config.gitService, oldCommitId, newCommitId);
18194
- const statusAfter = await this.config.gitService.getStatus();
18195
- const newChanges = extractChangesFromStatus(statusAfter);
18196
- if (0 === newChanges.length) {
18197
- logger_logger.verbose(external_chalk_default().gray(" No local changes - working directory is clean"));
18198
- return {
18199
- localOnlyChanges: [],
18200
- conflicts: []
18201
- };
18202
- }
18203
- const result = categorizeChanges(newChanges, locallyChangedFiles, remoteChangedFiles);
18204
- await acceptRemoteChanges(this.config.gitService, result.remoteOnlyChanges);
18205
- logConflictResolution(result);
18206
- return {
18207
- localOnlyChanges: result.localOnlyChanges,
18208
- conflicts: result.conflicts
18209
- };
18210
- } finally{
18211
- this.syncInProgress = false;
18212
- }
18278
+ await this.config.editorYaml.reload();
18279
+ return "clean-move";
18280
+ });
18213
18281
  }
18214
- async fetchAndResetFromAnvil(localChangesToPreserve = new Set()) {
18282
+ async withFetchedAnvilRef(callback) {
18215
18283
  const validToken = await auth_getValidAuthToken(this.config.anvilUrl, this.config.username);
18216
18284
  this.config.setAuthToken(validToken);
18217
18285
  const httpUrl = anvil_api_getGitFetchUrl(this.config.appId, this.config.getAuthToken(), this.config.anvilUrl);
18218
18286
  const currentBranch = this.config.getCurrentBranch();
18219
18287
  const tempRef = `anvil-sync-temp-${Date.now()}`;
18220
- const oldCommitId = this.config.getCommitId();
18221
- await this.config.gitService.fetch(httpUrl, `+${currentBranch}:${tempRef}`);
18288
+ try {
18289
+ await this.config.gitService.fetch(httpUrl, `+${currentBranch}:${tempRef}`);
18290
+ return await callback(tempRef);
18291
+ } finally{
18292
+ await this.config.gitService.deleteRef(`refs/heads/${tempRef}`);
18293
+ }
18294
+ }
18295
+ async resetToFetchedAnvilRef(tempRef, oldCommitId, localChangesToPreserve) {
18222
18296
  await this.config.gitService.reset(tempRef, "mixed");
18223
- await this.config.gitService.deleteRef(`refs/heads/${tempRef}`);
18224
18297
  const newCommitId = await this.config.gitService.getCommitId();
18225
18298
  await this.config.gitService.checkout([
18226
18299
  ".anvil_editor.yaml",
@@ -18230,6 +18303,9 @@ Promise.resolve(executeGitCredentialOperation(process.argv[2] || "get", {
18230
18303
  await this.deleteFilesRemovedOnAnvilLocally(oldCommitId, newCommitId, localChangesToPreserve);
18231
18304
  await this.discardFormattingOnlyYamlChanges();
18232
18305
  }
18306
+ isCleanForFastForward(status) {
18307
+ return status.isClean && 0 === status.modified.length && 0 === status.notAdded.length && 0 === status.created.length && 0 === status.deleted.length && 0 === status.staged.length && 0 === status.renamed.length;
18308
+ }
18233
18309
  async deleteFilesRemovedOnAnvilLocally(oldCommitId, newCommitId, localChangesToPreserve) {
18234
18310
  try {
18235
18311
  const status = await this.config.gitService.getStatus();
@@ -18443,7 +18519,7 @@ Promise.resolve(executeGitCredentialOperation(process.argv[2] || "get", {
18443
18519
  isPaused: ()=>this.isPausedForUserInput
18444
18520
  });
18445
18521
  this.saveProcessor.setSyncCallback((filePaths)=>this.syncManager.syncRemoteChanges(filePaths));
18446
- this.saveProcessor.setPostSaveCallback(()=>this.syncManager.fetchAndResetFromAnvil());
18522
+ this.saveProcessor.setPostSaveCallback((filePaths)=>this.syncAfterSave(filePaths));
18447
18523
  this.saveProcessor.on("save-started", (data)=>this.emit("save-started", data));
18448
18524
  this.saveProcessor.on("save-succeeded", (data)=>this.emit("save-succeeded", data));
18449
18525
  this.saveProcessor.on("save-failed", (data)=>this.emit("save-failed", data));
@@ -18456,6 +18532,12 @@ Promise.resolve(executeGitCredentialOperation(process.argv[2] || "get", {
18456
18532
  this.saveProcessor.on("sync-conflict", (data)=>this.emit("sync-conflict", data));
18457
18533
  this.saveProcessor.on("max-retries-exceeded", (data)=>this.emit("max-retries-exceeded", data));
18458
18534
  }
18535
+ async syncAfterSave(savedFilePaths) {
18536
+ const status = await this.gitService.getStatus();
18537
+ const locallyChangedFiles = buildLocalChangesSet(status);
18538
+ if (!this.stagedOnly) for (const filePath of savedFilePaths)locallyChangedFiles.add(filePath);
18539
+ return this.syncManager.syncRemoteChanges(locallyChangedFiles);
18540
+ }
18459
18541
  async connectWebSocket() {
18460
18542
  this.wsClient = new WebSocketClient({
18461
18543
  appId: this.appId,
@@ -146,6 +146,16 @@ export declare class GitService {
146
146
  * @throws {GitError} if abort fails
147
147
  */
148
148
  rebaseAbort(): Promise<void>;
149
+ /**
150
+ * Check whether ancestorRef is an ancestor of descendantRef.
151
+ * Returns false when Git cannot prove the ancestor relationship.
152
+ */
153
+ isAncestor(ancestorRef: string, descendantRef: string): Promise<boolean>;
154
+ /**
155
+ * Fast-forward the current branch to a ref.
156
+ * @throws {GitError} if the merge cannot be completed as a fast-forward
157
+ */
158
+ mergeFastForward(ref: string): Promise<void>;
149
159
  /**
150
160
  * Delete a local ref.
151
161
  * Does not throw if ref doesn't exist.
@@ -1 +1 @@
1
- {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/services/git.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/services/git.ts"],"names":[],"mappings":"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"}
@@ -62,10 +62,11 @@ type SyncCallback = (filePaths: Set<string>) => Promise<{
62
62
  localOnlyChanges: FileChange[];
63
63
  conflicts: FileChange[];
64
64
  }>;
65
- type PostSaveCallback = () => Promise<void>;
65
+ type PostSaveCallback = SyncCallback;
66
66
  export declare class SaveProcessor extends Emitter<SaveProcessorEvents> {
67
67
  private hasPendingChanges;
68
68
  private debounceTimer;
69
+ private saveLoopPromise;
69
70
  private saveSequence;
70
71
  private readonly SAVE_DEBOUNCE_MS;
71
72
  private readonly MAX_RETRIES;
@@ -83,6 +84,8 @@ export declare class SaveProcessor extends Emitter<SaveProcessorEvents> {
83
84
  forceSave(): Promise<void>;
84
85
  cleanup(): void;
85
86
  private processSaveBatchWithEvents;
87
+ private drainSaveQueue;
88
+ private processOneSaveBatchWithEvents;
86
89
  private getSuccessMessage;
87
90
  private processSaveBatch;
88
91
  private getStagedChanges;
@@ -1 +1 @@
1
- {"version":3,"file":"SaveProcessor.d.ts","sourceRoot":"","sources":["../../src/watch/SaveProcessor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SaveProcessor.d.ts","sourceRoot":"","sources":["../../src/watch/SaveProcessor.ts"],"names":[],"mappings":"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"}
@@ -25,7 +25,7 @@ export interface SyncManagerConfig {
25
25
  export declare function stripNonSemanticYamlFields(yamlFile: string, parsed: Record<string, unknown> | undefined): Record<string, unknown>;
26
26
  export declare class SyncManager extends Emitter<SyncManagerEvents> {
27
27
  private config;
28
- private syncInProgress;
28
+ private syncQueue;
29
29
  constructor(config: SyncManagerConfig);
30
30
  /**
31
31
  * Syncs remote changes while preserving local modifications.
@@ -39,11 +39,16 @@ export declare class SyncManager extends Emitter<SyncManagerEvents> {
39
39
  localOnlyChanges: FileChange[];
40
40
  conflicts: FileChange[];
41
41
  }>;
42
+ private performSyncRemoteChanges;
42
43
  /**
43
44
  * Fetch latest from Anvil and reset the working directory.
44
45
  * @throws {AuthError | GitError} on failure
45
46
  */
46
47
  fetchAndResetFromAnvil(localChangesToPreserve?: Set<string>): Promise<void>;
48
+ private fetchAndMoveCleanTreeToAnvilHead;
49
+ private withFetchedAnvilRef;
50
+ private resetToFetchedAnvilRef;
51
+ private isCleanForFastForward;
47
52
  private deleteFilesRemovedOnAnvilLocally;
48
53
  private discardFormattingOnlyYamlChanges;
49
54
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SyncManager.d.ts","sourceRoot":"","sources":["../../src/watch/SyncManager.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAKrC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAQH,KAAK,UAAU,EAClB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,iBAAiB;IAC9B,cAAc,EAAE,EAAE,CAAC;IACnB,gBAAgB,EAAE;QAAE,gBAAgB,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CACrE;AAED,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,UAAU,CAAC;IACvB,UAAU,EAAE,iBAAiB,CAAC;IAC9B,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,gBAAgB,EAAE,MAAM,MAAM,CAAC;IAC/B,WAAW,EAAE,MAAM,MAAM,CAAC;IAC1B,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3C;AAED,wBAAgB,0BAA0B,CACtC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAC5C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAgBzB;AAED,qBAAa,WAAY,SAAQ,OAAO,CAAC,iBAAiB,CAAC;IACvD,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,cAAc,CAAS;gBAEnB,MAAM,EAAE,iBAAiB;IAKrC;;;;;;;OAOG;IACG,iBAAiB,CACnB,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAChC,OAAO,CAAC;QAAE,gBAAgB,EAAE,UAAU,EAAE,CAAC;QAAC,SAAS,EAAE,UAAU,EAAE,CAAA;KAAE,CAAC;IA2CvE;;;OAGG;IACG,sBAAsB,CAAC,sBAAsB,GAAE,GAAG,CAAC,MAAM,CAAa,GAAG,OAAO,CAAC,IAAI,CAAC;YAoB9E,gCAAgC;YAiBhC,gCAAgC;CAkGjD"}
1
+ {"version":3,"file":"SyncManager.d.ts","sourceRoot":"","sources":["../../src/watch/SyncManager.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAKrC,OAAO,EAAE,UAAU,EAAkB,MAAM,iBAAiB,CAAC;AAE7D,OAAO,EAQH,KAAK,UAAU,EAClB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,iBAAiB;IAC9B,cAAc,EAAE,EAAE,CAAC;IACnB,gBAAgB,EAAE;QAAE,gBAAgB,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CACrE;AAED,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,UAAU,CAAC;IACvB,UAAU,EAAE,iBAAiB,CAAC;IAC9B,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,gBAAgB,EAAE,MAAM,MAAM,CAAC;IAC/B,WAAW,EAAE,MAAM,MAAM,CAAC;IAC1B,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3C;AAED,wBAAgB,0BAA0B,CACtC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAC5C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAgBzB;AAED,qBAAa,WAAY,SAAQ,OAAO,CAAC,iBAAiB,CAAC;IACvD,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,SAAS,CAAuC;gBAE5C,MAAM,EAAE,iBAAiB;IAKrC;;;;;;;OAOG;IACG,iBAAiB,CACnB,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAChC,OAAO,CAAC;QAAE,gBAAgB,EAAE,UAAU,EAAE,CAAC;QAAC,SAAS,EAAE,UAAU,EAAE,CAAA;KAAE,CAAC;YAOzD,wBAAwB;IA8CtC;;;OAGG;IACG,sBAAsB,CAAC,sBAAsB,GAAE,GAAG,CAAC,MAAM,CAAa,GAAG,OAAO,CAAC,IAAI,CAAC;YAO9E,gCAAgC;YA2BhC,mBAAmB;YAgBnB,sBAAsB;IAapC,OAAO,CAAC,qBAAqB;YAYf,gCAAgC;YAiBhC,gCAAgC;CAkGjD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anvil-works/anvil-cli",
3
- "version": "0.7.0-canary.12",
3
+ "version": "0.7.0-canary.14",
4
4
  "description": "CLI tool for developing Anvil apps locally",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/api.d.ts",