@@ -91,6 +91,8 @@ public class Sketch {
9191 /** Moved out of Editor and into here for cleaner access. */
9292 private boolean untitled ;
9393
94+ /** true if we've posted a "sketch disappeared" warning */
95+ private boolean disappearedWarning ;
9496
9597 /**
9698 * Used by the command-line version to create a sketch object.
@@ -123,6 +125,7 @@ protected void load(String path) {
123125 int suffixLength = mode .getDefaultExtension ().length () + 1 ;
124126 name = mainFilename .substring (0 , mainFilename .length () - suffixLength );
125127 folder = new File (new File (path ).getParent ());
128+ disappearedWarning = false ;
126129 load ();
127130 }
128131
@@ -1197,6 +1200,7 @@ protected void updateInternal(String sketchName, File sketchFolder) {
11971200
11981201 name = sketchName ;
11991202 folder = sketchFolder ;
1203+ disappearedWarning = false ;
12001204 codeFolder = new File (folder , "code" );
12011205 dataFolder = new File (folder , "data" );
12021206
@@ -1498,28 +1502,34 @@ public void prepareBuild(File targetFolder) throws SketchException {
14981502
14991503
15001504 /**
1501- * Make sure the sketch hasn't been moved or deleted by some
1502- * nefarious user. If they did, try to re-create it and save.
1503- * Only checks to see if the main folder is still around,
1504- * but not its contents.
1505+ * Make sure the sketch hasn't been moved or deleted by a nefarious user.
1506+ * If they did, try to re-create it and save. Only checks whether the
1507+ * main folder is still around, but not its contents.
15051508 */
15061509 public void ensureExistence () {
15071510 if (!folder .exists ()) {
1508- // Disaster recovery, try to salvage what's there already.
1509- Messages .showWarning (Language .text ("ensure_exist.messages.missing_sketch" ),
1510- Language .text ("ensure_exist.messages.missing_sketch.description" ));
1511- try {
1512- folder .mkdirs ();
1513- modified = true ;
1511+ // Avoid an infinite loop if we've already warned about this
1512+ // https://github.com/processing/processing/issues/4805
1513+ if (!disappearedWarning ) {
1514+ disappearedWarning = true ;
1515+
1516+ // Disaster recovery, try to salvage what's there already.
1517+ Messages .showWarning (Language .text ("ensure_exist.messages.missing_sketch" ),
1518+ Language .text ("ensure_exist.messages.missing_sketch.description" ));
1519+ try {
1520+ folder .mkdirs ();
1521+ modified = true ;
1522+
1523+ for (int i = 0 ; i < codeCount ; i ++) {
1524+ code [i ].save (); // this will force a save
1525+ }
1526+ calcModified ();
15141527
1515- for (int i = 0 ; i < codeCount ; i ++) {
1516- code [i ].save (); // this will force a save
1528+ } catch (Exception e ) {
1529+ // disappearedWarning prevents infinite loop in this scenario
1530+ Messages .showWarning (Language .text ("ensure_exist.messages.unrecoverable" ),
1531+ Language .text ("ensure_exist.messages.unrecoverable.description" ), e );
15171532 }
1518- calcModified ();
1519-
1520- } catch (Exception e ) {
1521- Messages .showWarning (Language .text ("ensure_exist.messages.unrecoverable" ),
1522- Language .text ("ensure_exist.messages.unrecoverable.description" ), e );
15231533 }
15241534 }
15251535 }
0 commit comments