@@ -332,27 +332,47 @@ void loop() {
332
332
await this . loadSketch ( sketch . uri ) ; // Sanity check.
333
333
return sketch . uri ;
334
334
}
335
+
336
+ const copy = async ( sourcePath : string , destinationPath : string ) => {
337
+ return new Promise < void > ( ( resolve , reject ) => {
338
+ ncp . ncp ( sourcePath , destinationPath , async error => {
339
+ if ( error ) {
340
+ reject ( error ) ;
341
+ return ;
342
+ }
343
+ const newName = path . basename ( destinationPath ) ;
344
+ try {
345
+ const oldPath = path . join ( destinationPath , new URI ( sketch . mainFileUri ) . path . base ) ;
346
+ const newPath = path . join ( destinationPath , `${ newName } .ino` ) ;
347
+ if ( oldPath !== newPath ) {
348
+ await promisify ( fs . rename ) ( oldPath , newPath ) ;
349
+ }
350
+ await this . loadSketch ( FileUri . create ( destinationPath ) . toString ( ) ) ; // Sanity check.
351
+ resolve ( ) ;
352
+ } catch ( e ) {
353
+ reject ( e ) ;
354
+ }
355
+ } ) ;
356
+ } ) ;
357
+ }
358
+ // https://github.com/arduino/arduino-ide/issues/65
359
+ // When copying `/path/to/sketchbook/sketch_A` to `/path/to/sketchbook/sketch_A/anything` on a non-POSIX filesystem,
360
+ // `ncp` makes a recursion and copies the folders over and over again. In such cases, we copy the source into a temp folder,
361
+ // then move it to the desired destination.
335
362
const destination = FileUri . fsPath ( destinationUri ) ;
336
- await new Promise < void > ( ( resolve , reject ) => {
337
- ncp . ncp ( source , destination , async error => {
338
- if ( error ) {
339
- reject ( error ) ;
363
+ let tempDestination = await new Promise < string > ( ( resolve , reject ) => {
364
+ temp . track ( ) . mkdir ( { prefix } , async ( err , dirPath ) => {
365
+ if ( err ) {
366
+ reject ( err ) ;
340
367
return ;
341
368
}
342
- const newName = path . basename ( destination ) ;
343
- try {
344
- const oldPath = path . join ( destination , new URI ( sketch . mainFileUri ) . path . base ) ;
345
- const newPath = path . join ( destination , `${ newName } .ino` ) ;
346
- if ( oldPath !== newPath ) {
347
- await promisify ( fs . rename ) ( oldPath , newPath ) ;
348
- }
349
- await this . loadSketch ( destinationUri ) ; // Sanity check.
350
- resolve ( ) ;
351
- } catch ( e ) {
352
- reject ( e ) ;
353
- }
369
+ resolve ( dirPath ) ;
354
370
} ) ;
355
371
} ) ;
372
+ tempDestination = path . join ( tempDestination , sketch . name ) ;
373
+ await fs . promises . mkdir ( tempDestination , { recursive : true } ) ;
374
+ await copy ( source , tempDestination ) ;
375
+ await copy ( tempDestination , destination ) ;
356
376
return FileUri . create ( destination ) . toString ( ) ;
357
377
}
358
378
0 commit comments