Auto create parent directories for rename support

Sometimes renames will move a file into a directory
that does not yet exist.  This will create the
parent directories, using the same symlink logic,
to ensure that there is a valid destination.

Change-Id: Iaa005a12ce800c39f4db20f7c25a2a68cb40a52d
This commit is contained in:
Michael Runge
2014-07-21 17:40:02 -07:00
parent 945fc68c62
commit a91ecc59b2
2 changed files with 7 additions and 3 deletions

View File

@@ -357,8 +357,10 @@ Value* RenameFn(const char* name, State* state, int argc, Expr* argv[]) {
name);
goto done;
}
if (rename(src_name, dst_name) != 0) {
if (make_parents(dst_name) != 0) {
ErrorAbort(state, "Creating parent of %s() failed, error %s()",
dst_name, strerror(errno));
} else if (rename(src_name, dst_name) != 0) {
ErrorAbort(state, "Rename of %s() to %s() failed, error %s()",
src_name, dst_name, strerror(errno));
} else {
@@ -642,7 +644,7 @@ static int make_parents(char* name) {
*p = '\0';
if (make_parents(name) < 0) return -1;
int result = mkdir(name, 0700);
if (result == 0) printf("symlink(): created [%s]\n", name);
if (result == 0) printf("created [%s]\n", name);
*p = '/';
if (result == 0 || errno == EEXIST) {
// successfully created or already existed; we're done

View File

@@ -19,4 +19,6 @@
void RegisterInstallFunctions();
static int make_parents(char* name);
#endif