WM: various changes to file writing behavior
Saving with only a filename (from Python) wasn't being prevented, while it would successfully write the file to the working-directory, path remapping and setting relative paths wouldn't work afterwards as `Main.filepath` would have no directory component. Disallow this since it's a corner case which only ever occurs when path names without any directories are used from Python, the overhead of expanding the working-directory for all data saving operations isn't worthwhile. The following changes have been made: - bpy.ops.wm.save_mainfile() without a filepath argument fails & reports and error when the file hasn't been saved. Previously it would write to "untitled.blend" and set the `G.main->filepath` to this as well. - bpy.ops.wm.save_mainfile(filepath="untitled.blend") fails & reports and error as the filename has no directory component. - `BLI_path_is_abs_from_cwd` was added to check if the path would attempt to expand to the CWD.
This commit is contained in:
@@ -1002,25 +1002,30 @@ bool BLI_path_abs(char *path, const char *basepath)
|
||||
return wasrelative;
|
||||
}
|
||||
|
||||
bool BLI_path_is_abs_from_cwd(const char *path)
|
||||
{
|
||||
bool is_abs = false;
|
||||
const int path_len_clamp = BLI_strnlen(path, 3);
|
||||
|
||||
#ifdef WIN32
|
||||
if ((ppath_len_clamp >= 3 && BLI_path_is_abs(path)) || BLI_path_is_unc(path)) {
|
||||
is_abs = true;
|
||||
}
|
||||
#else
|
||||
if (path_len_clamp >= 2 && path[0] == '/') {
|
||||
is_abs = true;
|
||||
}
|
||||
#endif
|
||||
return is_abs;
|
||||
}
|
||||
|
||||
bool BLI_path_abs_from_cwd(char *path, const size_t maxlen)
|
||||
{
|
||||
#ifdef DEBUG_STRSIZE
|
||||
memset(path, 0xff, sizeof(*path) * maxlen);
|
||||
#endif
|
||||
bool wasrelative = true;
|
||||
const int filelen = strlen(path);
|
||||
|
||||
#ifdef WIN32
|
||||
if ((filelen >= 3 && BLI_path_is_abs(path)) || BLI_path_is_unc(path)) {
|
||||
wasrelative = false;
|
||||
}
|
||||
#else
|
||||
if (filelen >= 2 && path[0] == '/') {
|
||||
wasrelative = false;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (wasrelative) {
|
||||
if (!BLI_path_is_abs_from_cwd(path)) {
|
||||
char cwd[FILE_MAX];
|
||||
/* in case the full path to the blend isn't used */
|
||||
if (BLI_current_working_dir(cwd, sizeof(cwd))) {
|
||||
@@ -1031,9 +1036,10 @@ bool BLI_path_abs_from_cwd(char *path, const size_t maxlen)
|
||||
else {
|
||||
printf("Could not get the current working directory - $PWD for an unknown reason.\n");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
return wasrelative;
|
||||
return false;
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
|
||||
Reference in New Issue
Block a user