Fossil SCM
Change the file_mkfolder() implementation to assume that the folder already exists and only go about creating it and its path if it does not previously exit.
Commit
92ea61837e987614f65a5b0da27c54c83534361e6c7806a6447db51e77ff76ca
Parent
b5f0d70362be031…
1 file changed
+7
-16
+7
-16
| --- src/file.c | ||
| +++ src/file.c | ||
| @@ -632,32 +632,23 @@ | ||
| 632 | 632 | char *zName; |
| 633 | 633 | |
| 634 | 634 | nName = strlen(zFilename); |
| 635 | 635 | zName = mprintf("%s", zFilename); |
| 636 | 636 | nName = file_simplify_name(zName, nName, 0); |
| 637 | - for(i=1; i<nName; i++){ | |
| 638 | - if( zName[i]=='/' ){ | |
| 639 | - zName[i] = 0; | |
| 640 | -#if defined(_WIN32) || defined(__CYGWIN__) | |
| 641 | - /* | |
| 642 | - ** On Windows, local path looks like: C:/develop/project/file.txt | |
| 643 | - ** The if stops us from trying to create a directory of a drive letter | |
| 644 | - ** C: in this example. | |
| 645 | - */ | |
| 646 | - if( !(i==2 && zName[1]==':') ){ | |
| 647 | -#endif | |
| 637 | + while( nName>0 && zName[nName-1]!='/' ){ nName--; } | |
| 638 | + if( nName ){ | |
| 639 | + zName[nName-1] = 0; | |
| 640 | + if( file_wd_isdir(zName)!=1 ){ | |
| 641 | + rc = file_mkfolder(zName, forceFlag, errorReturn); | |
| 642 | + if( rc==0 ){ | |
| 648 | 643 | if( file_mkdir(zName, forceFlag) && file_wd_isdir(zName)!=1 ){ |
| 649 | - if (errorReturn <= 0) { | |
| 644 | + if( errorReturn <= 0 ){ | |
| 650 | 645 | fossil_fatal_recursive("unable to create directory %s", zName); |
| 651 | 646 | } |
| 652 | 647 | rc = errorReturn; |
| 653 | - break; | |
| 654 | 648 | } |
| 655 | -#if defined(_WIN32) || defined(__CYGWIN__) | |
| 656 | 649 | } |
| 657 | -#endif | |
| 658 | - zName[i] = '/'; | |
| 659 | 650 | } |
| 660 | 651 | } |
| 661 | 652 | free(zName); |
| 662 | 653 | return rc; |
| 663 | 654 | } |
| 664 | 655 |
| --- src/file.c | |
| +++ src/file.c | |
| @@ -632,32 +632,23 @@ | |
| 632 | char *zName; |
| 633 | |
| 634 | nName = strlen(zFilename); |
| 635 | zName = mprintf("%s", zFilename); |
| 636 | nName = file_simplify_name(zName, nName, 0); |
| 637 | for(i=1; i<nName; i++){ |
| 638 | if( zName[i]=='/' ){ |
| 639 | zName[i] = 0; |
| 640 | #if defined(_WIN32) || defined(__CYGWIN__) |
| 641 | /* |
| 642 | ** On Windows, local path looks like: C:/develop/project/file.txt |
| 643 | ** The if stops us from trying to create a directory of a drive letter |
| 644 | ** C: in this example. |
| 645 | */ |
| 646 | if( !(i==2 && zName[1]==':') ){ |
| 647 | #endif |
| 648 | if( file_mkdir(zName, forceFlag) && file_wd_isdir(zName)!=1 ){ |
| 649 | if (errorReturn <= 0) { |
| 650 | fossil_fatal_recursive("unable to create directory %s", zName); |
| 651 | } |
| 652 | rc = errorReturn; |
| 653 | break; |
| 654 | } |
| 655 | #if defined(_WIN32) || defined(__CYGWIN__) |
| 656 | } |
| 657 | #endif |
| 658 | zName[i] = '/'; |
| 659 | } |
| 660 | } |
| 661 | free(zName); |
| 662 | return rc; |
| 663 | } |
| 664 |
| --- src/file.c | |
| +++ src/file.c | |
| @@ -632,32 +632,23 @@ | |
| 632 | char *zName; |
| 633 | |
| 634 | nName = strlen(zFilename); |
| 635 | zName = mprintf("%s", zFilename); |
| 636 | nName = file_simplify_name(zName, nName, 0); |
| 637 | while( nName>0 && zName[nName-1]!='/' ){ nName--; } |
| 638 | if( nName ){ |
| 639 | zName[nName-1] = 0; |
| 640 | if( file_wd_isdir(zName)!=1 ){ |
| 641 | rc = file_mkfolder(zName, forceFlag, errorReturn); |
| 642 | if( rc==0 ){ |
| 643 | if( file_mkdir(zName, forceFlag) && file_wd_isdir(zName)!=1 ){ |
| 644 | if( errorReturn <= 0 ){ |
| 645 | fossil_fatal_recursive("unable to create directory %s", zName); |
| 646 | } |
| 647 | rc = errorReturn; |
| 648 | } |
| 649 | } |
| 650 | } |
| 651 | } |
| 652 | free(zName); |
| 653 | return rc; |
| 654 | } |
| 655 |